validation - कोई मान्यता नियम सक्रिय नहीं होने के साथ Yii2 में परिदृश्य कैसे बनाएं?




scenarios validationrules yii-validation (3)

अगर मैं सही ढंग से आपके प्रश्न को समझाता हूं, तो आप scenario_three को वर्तमान परिदृश्य के रूप में निर्दिष्ट कर सकते हैं: मॉडल मिलान किए गए नियमों को नहीं मिलेगा और सत्यापन चेक को छोड़ देगा।

public function actionThree($id)
{           
    $modelMyEntity = $this->findModel($id);
    $modelMyEntity->scenario = 'scenario_three';
    .
    .
    .
}

UPD: हालांकि मैं सख्ती से सभी परिदृश्यों और संबंधित सक्रिय विशेषताओं को परिभाषित करने की सलाह देता हूं ( scenario विधि में) और $scenarios = parent::scenarios(); निकालना $scenarios = parent::scenarios(); , क्योंकि यह अनावश्यक प्रभाव पैदा कर सकता है। माता-पिता के कार्यान्वयन को ज्यादातर वाईआई 1 के साथ पिछड़े संगतता के लिए विकसित किया गया है, जिसके पास कोई scenarios() नहीं scenarios() तरीके और यह आमतौर पर माना जाता है कि यदि आप scenarios() विधि को ओवरराइड करते scenarios() , तो आपको अपने स्पष्ट रूप से परिभाषित परिस्थितियों को मूल कार्यान्वयन के साथ मर्ज नहीं करना चाहिए।

मेरे पास MyEntity.php मॉडल है मॉडल स्क्रिप्ट के एक भाग के रूप में, कुछ नियम और कुछ परिदृश्य निर्धारित किए गए हैं:

public function rules()
{
    return [
        [['myentity_id', 'myentity_title', 'myentity_content', 'myentity_date'], 'required'],
        [['myentity_id'], 'integer'],
        [['myentity_title', 'myentity_content'], 'string', 'max' => 120],
        [['myentity_date'], 'safe'],            
    ];
}

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios['scenario_one'] = ['myentity_id', 'myentity_title'];
    $scenarios['scenario_two'] = ['myentity_id', 'myentity_content'];
    return $scenarios;
}

मुझे अलग-अलग परिदृश्यों में सक्षम होने की जरूरत है, और विभिन्न कार्यों के लिए सक्रिय होने के लिए केवल कुछ मान्यताओं (पैरामीटर द्वारा) उदाहरण के लिए, कार्रवाई के लिए परिदृश्य_ऑन एक, परिदृश्य_ दो कार्यवाही के लिए दो आदि।

यहां नियंत्रक से कोड का कुछ छोटा हिस्सा है:

public function actionOne($id)
{           
    $modelMyEntity = $this->findModel($id);
    $modelMyEntity->scenario = 'scenario_one';
    .
    .
    .
}

public function actionTwo($id)
{           
    $modelMyEntity = $this->findModel($id);
    $modelMyEntity->scenario = 'scenario_two';
    .
    .
    .
}

अब मुझे एक परिदृश्य -2 होना है जहां सभी पर कोई मान्यता नहीं होना चाहिए। मुझे उस कोड में अतिरिक्त चेक मिलेंगे जो डाटाबेस में भंडारण करते समय विफल रहेगा। मुझे यह सुनिश्चित करने की ज़रूरत है कि कोई सत्यापन लागू नहीं किया जा रहा है क्योंकि यह मेरे फॉर्म को सबमिट करने से रोक रहा है। अगर मैं किसी भी परिदृश्य को लागू नहीं करता है, तो डिफ़ॉल्ट परिदृश्य लागू किया जाता है (सभी सूचीबद्ध मान्यताओं सक्रिय होंगे, जो कि परिदृश्य की पूरी तरह से विपरीत है)।


ऐसा करने में सक्षम होने के लिए, आपको कुछ चीजें करने की आवश्यकता है (जिन लोगों को आपने लगभग खुद किया था):

  • अपने नियंत्रक में, $modelMyEntity->scenario = 'scenario_three';

  • मॉडल में, scenarios() विधि में एक अतिरिक्त परिदृश्य सरणी 'scenario_three' जोड़ें:

इस कदर:

$scenarios['scenario_three'] = ['myentity_id', 'myentity_content'];
  • अंत में, अधिकांश परिवर्तन rules() में आवश्यक होंगे क्योंकि आपको विशिष्ट परिस्थितियों को शामिल करने या निकालने की आवश्यकता होगी।

मूल रूप से, प्रत्येक नियम में आप सशर्त और बिंदु के except अब लिख सकते हैं जो विशेषताओं के अनुरूप नहीं होंगे। तो आपके उदाहरण में, मान लीजिए, चलो scenario_three लिए सभी विशेषताओं को छोड़ दें:

[['myentity_id', 'myentity_title', 'myentity_content', 'myentity_date'], 'required', 'except' => 'scenario_three'],
[['myentity_id'], 'integer', 'except' => 'scenario_three'],
[['myentity_title', 'myentity_content'], 'string', 'max' => 120, 'except' => 'scenario_three'],
[['myentity_date'], 'safe'],

यह नियमों की उपेक्षा करने का एक अलग समाधान है, लेकिन मुझे यह अधिक आकर्षक लगता है क्योंकि भविष्य में यह इस परिदृश्य के लिए विशिष्ट विशेषताओं को जोड़ना / निकालना आसान होगा और अन्य डेवलपर्स के लिए भी आसान हो जाएगा (यदि आप बस से अधिक है) समझने के लिए कि आप क्या करने की कोशिश कर रहे हैं

लेकिन मुझे लगता है कि @ आईसट्रेंजर के समाधान भी काम करते हैं (बहुत सरल)।


और भी:

@Autowired
@Qualifier("mvcValidator")
Validator validator;

...
violations = validator.validate(account);




validation yii2 scenarios validationrules yii-validation