Валидация несуществующего поля: scenarios, save with field list

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
lgXenos
Сообщения: 243
Зарегистрирован: 2015.11.30, 15:42

Валидация несуществующего поля: scenarios, save with field list

Сообщение lgXenos »

В общем вновь привет
Появился вопрос от недопонимания работы сценариев и правил валидации в объекте AR.

Что у меня сейчас в голове:
- сценарий - это конкретный список полей, который доступен сейчас;
- если в save я передал поле, которого нет в сценарии - Yii должен его пропустить (load же не грузит левые переменные);
- в моем примере я опускаю first_name в сценарии, т.к. он не нужен сейчас;
- в save он "влетает" в агрегаторе моделей на автомате: все поля, которые только допустимы в текущих рамках;

По факту мы пытаемся валидировать поле, которое не указано в списке и "падаем".
Конечно же гугление дало подсказку дескать:
Если вы не укажите в правилах атрибут on, то данное правило будет применяться во всех сценариях.
Но у меня тогда вопрос: почему, если я не передаю список полей - у меня нет ошибки, что first_name обязателен.
А если неким образом в 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
lgXenos
Сообщения: 243
Зарегистрирован: 2015.11.30, 15:42

Re: Валидация несуществующего поля: scenarios, save with field list

Сообщение lgXenos »

Занятно... даже вариантов ртфм не предлагают... :)
Ответить