Появился вопрос от недопонимания работы сценариев и правил валидации в объекте AR.
Что у меня сейчас в голове:
- сценарий - это конкретный список полей, который доступен сейчас;
- если в save я передал поле, которого нет в сценарии - Yii должен его пропустить (load же не грузит левые переменные);
- в моем примере я опускаю first_name в сценарии, т.к. он не нужен сейчас;
- в save он "влетает" в агрегаторе моделей на автомате: все поля, которые только допустимы в текущих рамках;
По факту мы пытаемся валидировать поле, которое не указано в списке и "падаем".
Конечно же гугление дало подсказку дескать:
Но у меня тогда вопрос: почему, если я не передаю список полей - у меня нет ошибки, что first_name обязателен.Если вы не укажите в правилах атрибут on, то данное правило будет применяться во всех сценариях.
А если неким образом в save прилетает массив полей, которых нет в сценарии - все сразу падает?
И решить я смог лишь дописыванием к first_name , 'on' => 'default'
Разве это нормально?
Код: Выделить всё
/*
*
*/
class Borrower extends ActiveRecord {
public function scenarios() {
$scenarios = parent::scenarios();
$scenarios[self::SCENARIO_SAVE_FAST_REG] = ['ab'];
return $scenarios;
}
public function rules() {
return [
[['first_name'], 'required'],
[['ab'], 'string']
];
}
}
/*
*
*/
$b = new \borrower\models\Borrower();
$b->scenario = \borrower\models\Borrower::SCENARIO_SAVE_FAST_REG;
if(!$b->save(true, ['first_name'])){
iout($b->errors);
}
else {
exit('ok);
}
Result
[0] => Array
[first_name] => Array
[0] => Необходимо заполнить «Имя».
Код: Выделить всё
/*
*
*/
$b = new \borrower\models\Borrower();
$b->scenario = \borrower\models\Borrower::SCENARIO_SAVE_FAST_REG;
if(!$b->save()){ // просто без указания принудительно поля
iout($b->errors);
}
else {
exit('ok');
}
ok
Код: Выделить всё
// [['first_name'], 'required'], 'on' => 'default'
/*
*
*/
$b = new \borrower\models\Borrower();
$b->scenario = \borrower\models\Borrower::SCENARIO_SAVE_FAST_REG;
if(!$b->save(true, ['first_name'])){
iout($b->errors);
}
else {
exit('ok');
}
ok