Задать вопрос
kimono
@kimono
Web developer

Как пропустить валидацию или присвоение поля в YII2?

Какие есть варианты запретить изменение атрибута основываясь на роли пользователя?
Нужно разрешить массовое присвоение этого атрибута при создании - для админа и девелопера, а при редактировании - только для девелопера. Мой вариант сейчас:
Модель:
public function rules(){
  return [
    ['id', 'required'],
    ['id', 'string'],
    ['id', 'unique'],
  ];
}
public function scenarios(){
  return [
    MODEL::SCENARIO_DEFAULT => ['id', 'title'],
    MODEL::SCENARIO_UPDATE => ['title'],
  ];
}

Контроллер:
public function actionUpdate($id){
  $model = $this->findModel($id);
  if (Yii::$app->user->identity->role < User::ROLE_DEVELOPER){
    $model->scenario = $model::SCENARIO_UPDATE;
  }
  // ...
}

Не хочется использовать этот вариант, т.к. данный контроллер наследуется от "базового ManagerController", в котором не нужен такой функционал. Да и переписывать метод в этом контроллере не хочется.
Думаю можно навесить такую проверку в beforeValidate в модели. Но возможно есть что-то более лаконичное? Может в rules как-то это прикрутить?
  • Вопрос задан
  • 444 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 1
kimono
@kimono Автор вопроса
Web developer
Решено так:
public function load($data, $formName = null)
{
  if (!$this->isNewRecord && User::identity()->role < User::ROLE_DEVELOPER) {
    $this->scenario = self::SCENARIO_UPDATE;
  }
  
  return parent::load($data, $formName);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы