FlagsPanel и доступ
FlagsPanel — это контракт модуля для системы прав. Модуль декларирует список своих action’ов; в админке для каждого action можно настроить какой флаг (a–z) нужен для доступа.
Зачем это нужно #
Раньше модули хардкодили роли (Auth::isRole('admin')). Сейчас права настраиваются без кода: для action’а указывается требуемый флаг, и admin может в любой момент его поменять через UI /s-panel/flags-settings.
Это даёт три плюшки:
- Разные сайты могут одинаковый модуль настроить по-разному.
- Новые роли создаются без релиза кода — просто новая буква + новые группы.
- Перенос прав на мобильный REST идёт автоматически:
DispatchControllerчитает ту же таблицу.
Декларация actions #
Модуль реализует интерфейс FlagsPanelInterface и отдаёт список своих действий с описаниями. Эти описания админ увидит в форме настройки прав:
final class BannerFlagsPanel implements FlagsPanelInterface { public function module(): string { return 'Banner'; } public function actions(): array { return [ ['key' => 'view', 'label' => 'Доступ к разделу', 'description' => 'Открывает /s-panel/banner. Без права пункт меню не виден.'], ['key' => 'create', 'label' => 'Создание баннеров'], ['key' => 'edit', 'label' => 'Редактирование'], ['key' => 'delete', 'label' => 'Удаление'], ]; } }
Action view по конвенции — корневой; именно он скрывает/показывает пункт меню и блокирует страницу-индекс.
Проверка в контроллере #
В коде проверка — одной строкой через хелпер module_require() или module_can():
public function create(Request $r): Response { // автоматический редирект на /s-panel/ если нет флага, привязанного к Banner.create if ($resp = module_require('Banner', 'create', '/s-panel/')) return $resp; // … нормальный CRUD } // или мягко в шаблоне: <?php if (module_can('Banner', 'delete')): ?> <button>Удалить</button> <?php endif; ?>
Под капотом обе функции читают таблицу settings__module_flags: (Banner, create) → required_flag. Если в этой таблице нет записи или флаг = NULL — действие доступно всем авторизованным. Если флаг указан — проверяется через Auth::flags() (личные + от групп).
Что админ видит в /flags-settings #
Заходя в Настройка доступа и выбирая модуль, admin получает список action’ов с описаниями из FlagsPanel и выпадушки «требуемый флаг». Доступно из коробки:
- «Доступно всем» — без проверки
- Любая буква из
settings__flagsс подписью (например,b — Редактирование чужого)
Подробнее — на странице «Настройка доступа».