Как в matchCallback передать используемую модель?

Есть необходимость разрешить редактирование поста только пользователем с ролью manager да и ещё авторами поста id автора поста хранится в ячейке autor_id
пытаюсь организовать это так в контроллере:
public function behaviors()
    {
    'access' => [
        'class' => AccessControl::className(),
        'ruleConfig' => [
            'class' => AccessRule::className(),
        ],
        'rules' => [
            [
                'actions' => ['update'],
                'allow' => true,
                'roles' => ['manager'],
                'matchCallback' => function ($rule, $action,$model) {
                    return Yii::$app->user->identity->id==$model->autor_id;}
            ],
        ]
    ]    
}

Доступ я не получаю, как вы понимаете, и понимаю, что делаю, что то не то. Не подскажите как правильно?
  • Вопрос задан
  • 627 просмотров
Решения вопроса 1
@matperez
Мне кажется, вам уже можно использовать RBAC

И еще один момент. Ваша задача там решается так
[
    'allow' => true,
    'actions' => ['update'],
    'roles' => ['updatePost'],
    'roleParams' => function() {
        return ['post' => Post::findOne(Yii::$app->request->get('id'))];
    },
],


или так

[
    'allow' => true,
    'actions' => ['update'],
    'roles' => ['updatePost'],
    'roleParams' => ['postId' => Yii::$app->request->get('id')];
],


Если абстрагироваться от RBAC, то следуя этой логике вы должны самостоятельно найти модель в БД в matchCallback и там уже выполнить все необходимые проверки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Arik
Можно в контроллере сделать метод getModel(), который будет кэшировать результат (ложить в свойство). тогда в замыкании можно сделать $this->getModel()->autor_id.

Проблема что фильтры запускают До основного действия.
Ответ написан
Sergalas
@Sergalas Автор вопроса
Учусь
но за это решение спасибо Post::findOne(Yii::$app->request->get('id')) в принципе ответ поэтому и присваиваю.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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