Господа,помогите пожалуйста разобраться с настройкой прав, а точнее - можно ли наследовать их?.
опишу сначала вкрадце:
есть контроллер common/controllers/BackendController.php который наследует Controller и содержит правила доступа
все контроллеры приложения наследуют не Controller, a BackendController, чтобы по сто раз правила не переписывать и не загромождать код.
и вот в одном кнтроллере нужно изменить одно лишь правило. как это сделать?
теперь подробно опишу ситуацию "на пальцах", чтобы понятнее было:
В моем приложении есть несколько контроллеров и две роли: админ и юзер. во всех контроллерах есть один и тот же набор методов: index, delete, view, update, и ко всем методам имеют доступ обе роли.
чтобы в каждом контроллере не прописывать один и тот же набор правил я вынес все в отдельный контроллер и наследую его. т.е.
создал "common/controllers/BackendController.php" в нем:
Код: Выделить всё
namespace common\controllers;
use Yii;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
class BackendController extends Controller
{
public function behaviors()
...
...
...
...
все бы хорошо, но понадобилось мне, чтобы в контроллере PostController к экшену delete был доступ только у админа.
если в PostController вызывать метод behaviors() и полностью дублировать права, за изменением одного лишь метода, то смысла в общем контроллере нет, т.к. таких контроллеров с измененным доступом к лишь одному методу может быть много...
Попробовал сделать так: в PostController вызывать метод behaviors(), переписать одно лишь правило и передать в родительский метод behaviors(), с параметром. а там смержить массивы. но не сработало:
Код: Выделить всё
public function behaviors()
{
return parent::behaviors($rules);
}
в итоге получается такой массив правил:
Код: Выделить всё
$rules = [
[
'actions' => ['delete'],
'allow' => true,
'roles' => ['admin'],
],
[
'actions' => ['index', 'delete', 'view', 'update'],
'allow' => true,
'roles' => ['user'],
],
];
я вижу два выхода:
1 - полностью в контроллере переписывать все правила
2 - в BackendController в методе behaviors() прогонять массивы с ролями и из изначальных правил выкидывать те, что пришли из контроллера PostController.
подскажите, какие-то могут быть еще варианты?
Заранее благодарен!