Я работаю над приложением, где каждый пользователь может иметь доступ ко многим Project
и где каждый Project
может содержать много Campaign
(s) и так далее и тому подобное.
Тогда мои URL выглядят так:
/ Проект /{project}
/ член
/ Проект /{project}
/ Членом /{member}
/ Проект /{project}
/ кампания
/ Проект /{project}
/ Кампании /{campaign}
/ Проект /{project}
/ Кампании /{campaign}
/сюжет
/ Проект /{project}
/ Кампании /{campaign}
/сюжет/{plot}
Я прочитал это @ParamConverter
может обрабатывать эти URL в соответствии с моими потребностями.
—Problem—
Я ищу способ, которым любой пользователь, имеющий доступ к проекту, имеет право … без копирования кода внутри каждого контроллера.
Один пользователь может быть привязан ко многим проектам, предоставленным с (ROLE_MEMBER
или же ROLE_ADMIN
).
Я бы предложил сделать себя слушателем KernelEvents :: CONTROLLER в соответствии с http://symfony.com/doc/current/cookbook/service_container/event_listener.html
Ваш слушатель будет вызван после сопоставления маршрута с контроллером, но до вызова метода действия контроллера. В аргументе request будут установлены переменные вашего проекта / кампании и т. Д.
Затем я бы предложил разрешить этому слушателю загружаться в ваш проект и кампанию вместо использования param converter. Я просто думаю, что это будет немного чище. Все, что вам нужно сделать, это получить их, а затем сохранить их обратно в объект запроса. Затем они окажутся в вашем методе действия контроллера.
Получив свои объекты, вы можете использовать контекст безопасности для проверки ролей и просто выбросить исключение AccessDenied, если это необходимо.
Я бы на самом деле переместил проверку прав доступа одному или нескольким избирателям безопасности http://symfony.com/doc/current/cookbook/security/voters_data_permission.html .
Это даст вам более детальный контроль доступа, не прибегая к полному списку контроля доступа. Это также означает, что при необходимости вы можете выполнять проверку ролей в других местах, например, в шаблонах.
Других решений пока нет …