syamskoy
@syamskoy

Как правильней устаноить значение по умолчанию в Yii2?

Ситуация, когда надо приписать в моделе значение по умолчанию очень часта, как это можно реализовать в Yii2 есть мнжество способов, но как будет правильне?? Yii2 не так давно изучаю, от сюда и возник такой вопрос. Итак, что ужалось найти, на примере user_id из текущей сессии:

1) Прописать в метод beforeValidation
public function beforeValidation(){
if($this->isNewRecord()){
$this->user_id = Yii::$app->user->identity->id
}
}


1.5) или beforeSave

public function beforeSave($insert){
if($insert){
$this->user_id = Yii::$app->user->identity->id
}
}


2) В моделе в rules прописываем:
public function rules()
    {
        return [
            ['user_id', 'integer'],
            ['user_id', 'default', 'value' => Yii::$app->user->identity->id ],
        ];
    }


3) С помощью behaviors:

public function behaviors()
    {
        return [
            'blame' => [
                'class' => BlameableBehavior::className(),
                'attributes' => [
                    BaseActiveRecord::EVENT_BEFORE_INSERT => 'user_id'
                ],
            ]
        ];
    }


4) Есть и вариант с передачей в модель при объявлении объекта
$model = new SomeThing(['user_id' => Yii::$app->user->identity->id ]);


Так как же в более правильнее в ситуации указания текущего пользователя по умолчанию?
  • Вопрос задан
  • 2687 просмотров
Решения вопроса 2
qonand
@qonand
Software Engineer
лучше использовать вариант №2 т.к. он более явно задает значение по умолчанию, кроме того после применения default-валидатора есть возможность проверить заданное значение с помощью других валидаторов.
Варианты c afterSave и beforeSave - сделают код менее удобным для восприятия.
Вариант с behaviors - даст кучу лишнего кода и усложнит его понимание
Вариант с передачей в модель при объявлении объекта значения именно по УМОЛЧАНИЮ вообще не тру, ибо в каждом месте где создается объект придется это прописывать
Ответ написан
Комментировать
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
beforeValidation - не будет срабатывать, например при $model->save(false)
beforeSave - будет срабатывать всегда хотите Вы того или нет
rules - хороший вариант при большинстве задач, но вы должны понимать, что там будет null если пользователь не залогинен
behaviors - удобен с случае не просто значения, а какой-то логики, удобно если не нужен и возможен null в предыдущем варианте
4 вариант - удобен если в каждом случае разные user_id + отлично уживется с rules или behaviors
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы