您可以将任何您想要的内容添加到默认数组中,它们将被传递。例如:
cerad_game__project__game__update__by_scorer:
path: /project/{_project}/game/{_game}/update-by-scorer
defaults:
_role: ROLE_SCORER_ADMIN
_model: cerad_game__project__game__update__by_scorer__model_factory
_form: cerad_game__project__game__update__by_scorer__form_factory
_controller: cerad_game__project__game__update__by_scorer__controller:action
_template: '@CeradGame/Project/Game/Update/ByScorer/GameUpdateByScorerTwigPage.html.twig'
然后,您将创建一个内核控制器侦听器,该侦听器将在控制器解析之后但在调用控制器操作方法之前调用。
class ModelEventListener extends ContainerAware implements EventSubscriberInterface {
public static function getSubscribedEvents()
{
return array(
KernelEvents::CONTROLLER => array(
array('onControllerRole', self::ControllerRoleEventListenerPriority),
array('onControllerModel', self::ControllerModelEventListenerPriority),
array('onControllerForm', self::ControllerFormEventListenerPriority),
),
KernelEvents::VIEW => array(
array('onView', self::ViewEventListenerPriority),
),
);
}
public function onControllerRole(FilterControllerEvent $event)
{
if (!$event->getRequest()->attributes->has('_role')) return;
$role = $event->getRequest()->attributes->get('_role');
$securityContext = $this->container->get('security.context');
if (!$securityContext->isGranted($role))
{
// For public it redirects
// For users we see the exception
// die('access denied ' . $event->getRequest()->attributes->get('_route'));
throw new AccessDeniedException();
}
}
然后接线:
cerad_core__model_event_listener:
class: '%cerad_core__model_event_listener__class%'
calls:
- [setContainer, ['@service_container']]
tags:
- { name: kernel.event_subscriber }
在此处记录:http://symfony.com/doc/current/cookbook/event_dispatcher/event_listener.html
请注意,我在这里注入了容器,而不仅仅是安全上下文。我需要其他方法的容器。它也是2.7代码。还没来得及更新到 3.0。