если Вы в каждом экшене проверяете с помощью can, для решения этой проблемы есть два варианта:
1. Проверять доступ к экшену с помощью
AccessControl на уровне контроллера/модуля, например:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => ['index'],
'roles' => ['nameAction'], // тут указываем название Permission
],
],
],
];
}
этот вариант конечно не особо автоматизирует проверку т.к. все равно вручную необходимо прописывать какому экшену какой Permission соответствует, но зато делает код менее зависимым.
2. Проверять доступ к экшену до выполнения экшена на уровне beforeAction контроллера (или его родителя), например:
public function beforeAction($action)
{
if (parent::beforeAction($action) === false) {
return false;
}
if (Yii::$app->user->can($this->module->id . '.' . $this->id . '.' . $action->id)) {
return true;
} else {
throw new \yii\web\ForbiddenHttpException();
}
}
Соответственно при таком подходе Permission должны иметь названия в формате "<название модуля>.<название контроллера>.<название экшена>"