Страница 1 из 1

Статусы и rbac

Добавлено: 2019.09.27, 10:50
Chelobaka
Здравствуйте господа знатоки.

Для редактирования статей в блоге есть 3 роли, редактор, админ и автор. (rbac)

При создании статьи статус = новая.

При создании автор может создать и потом отредактировать на статус = отмена

У редактора есть возможность поставить статус как у атора + статус = опубликована.

У админа есть все эта статусы + статус = проверена.

:?: Как сделать так что бы автор видел 2 статуса, редактор 3 и админ 4 статуса?

Спасибо.

Re: Статусы и rbac

Добавлено: 2019.09.27, 14:36
yiiliveext
Привязывайте статусы к разрешениям и формируйте список используя user->can(...). Этот вариант позволяет безболезненно добавлять новые роли, список всегда будет корректным.

Re: Статусы и rbac

Добавлено: 2019.09.30, 15:23
Chelobaka
yiiliveext писал(а): 2019.09.27, 14:36 Привязывайте статусы к разрешениям и формируйте список используя user->can(...). Этот вариант позволяет безболезненно добавлять новые роли, список всегда будет корректным.
То есть на каждый статус добавлять if? Такой вариант не годится. Каждый раз переписывать класс это не наш метод.

Re: Статусы и rbac

Добавлено: 2019.09.30, 15:41
yiiliveext
Chelobaka писал(а): 2019.09.30, 15:23 То есть на каждый статус добавлять if? Такой вариант не годится. Каждый раз переписывать класс это не наш метод.
В цикле по списку статусов. Конкретика зависит от того как вы храните статусы.

Re: Статусы и rbac

Добавлено: 2019.09.30, 21:16
Chelobaka
yiiliveext писал(а): 2019.09.30, 15:41
Chelobaka писал(а): 2019.09.30, 15:23 То есть на каждый статус добавлять if? Такой вариант не годится. Каждый раз переписывать класс это не наш метод.
В цикле по списку статусов. Конкретика зависит от того как вы храните статусы.
Статусы хранятся как константы класса. Не понял ход ваших мыслей, возможно пример псевдокода поможет, буду признателен.

Re: Статусы и rbac

Добавлено: 2019.10.01, 13:58
yiiliveext
Chelobaka писал(а): 2019.09.30, 21:16
yiiliveext писал(а): 2019.09.30, 15:41
Chelobaka писал(а): 2019.09.30, 15:23 То есть на каждый статус добавлять if? Такой вариант не годится. Каждый раз переписывать класс это не наш метод.
В цикле по списку статусов. Конкретика зависит от того как вы храните статусы.
Статусы хранятся как константы класса. Не понял ход ваших мыслей, возможно пример псевдокода поможет, буду признателен.
На самом деле, при таком раскладе вам все равно надо будет лезть в класс при изменении статусов. У вас же еще наверняка есть методы вроде getStatusName() и getStatusList(). Но не суть, вернемся к проблеме. Допустим у вас есть метод getBaseStatusList(), который возвращает массив наименований статусов ['New', 'Published', 'Approved', 'Canceled']. Тогда код будет выглядеть примерно так

Код: Выделить всё

$statuses = [];
$postStatuses = getBaseStatusList();
foreach ($postStatuses as $postStatus) {
    if (\Yii::$app->user->can('setPostStatus' . $postStatus) {
        $statuses[] = $postStatus;
    }
}
Соответственно создаем разрешения setPostStatusNew, setPoststatusCanceled, setPostStatusPublished, setPostStatusApproved.
Ну и назначаем ролям в соответствии с иерархией. При изменении/добавлении ролей/статусов просто добавляем/назначаем/отзываем соответствующие разрешения.

Re: Статусы и rbac

Добавлено: 2019.10.01, 17:46
Chelobaka
насколько я понял что то хранить в константах вообще не вариант.

Re: Статусы и rbac

Добавлено: 2019.10.01, 19:35
yiiliveext
Chelobaka писал(а): 2019.10.01, 17:46 насколько я понял что то хранить в константах вообще не вариант.
Почему, если список статусов статический или условно-статический, то это отличное решение. Работает быстро, хорошо читается в коде. А вот если динамический, да еще может произвольно редактироваться пользователем, да еще и мультиязычный, то тогда да, лучше хранить извне. Хотя при этом те же базовые статусы можно прописывать константами.