Вот имеется таблица order_service, в которой среди прочих есть колонка manager_id.
И есть таблица service, в которой есть колонка owner_id.
Имеются 2 пермишшна BProviderTicketViewForManager и BProviderTicketView(BProviderTicketViewForManager родитель для BProviderTicketView)
Первый проверяет доступ к просмотру страницы, определяя, является ли пользователь менеджером услуги заказа(совпадает ли поле manager_id таблицы order_service с текущим пользователем). А второй проверяет доступ на просмотр для роли Provider и роли Provider_manager(всех менеджеров этого конкретного провайдера).
Соответственно на каждом висит соответствующее правило.
И вот так выглядят эти правила
Код: Выделить всё
class ProviderAccessRule extends Rule
{
/**
* @inheritdoc
*/
public $name = 'providerAccess';
/**
* @inheritdoc
*/
public function execute($user, $item, $params)
{
if(isset($params['model'])){
/** @var Provider $model */
$model = $params['model'];
$userModel = User::findByPk($user);
if(isset($model->owner_id))
return $model->owner_id == $userModel->getMainId();
else return true;
}
return false;
}
}
Код: Выделить всё
class ManagerAccessRule extends Rule
{
/**
* @inheritdoc
*/
public $name = 'managerAccess';
/**
* @inheritdoc
*/
public function execute($user, $item, $params)
{
if(isset($params['model'])){
/** @var Provider $model */
$model = $params['model'];
if(isset($model->manager_id))
return $model->manager_id == $user;
}
return false;
}
}
А проверку доступа мне надо будет делать на один дочерний пермишшн - Yii->$app->getUser()->can('BProviderTicketView', [...])
Соответственно встал вопрос как лучше быть. То ли делать 2 разные проверки. То ли в правилах всё сводить к одной модели(но это не хотелось бы делать, т.к. правила могут и в других местах быть использованы)..То ли что-то еще придумывать.