【问题标题】:How to make common calls for each matched route in Symfony2?如何在 Symfony2 中为每个匹配的路由进行公共调用?
【发布时间】:2013-06-19 16:13:15
【问题描述】:

我有这样的路线:

events_print:
    pattern:  /list
    defaults:
        _controller: AcmeCompanyBundle:Events:list
        activeMenu: conferences_events_list

events_edit:
    pattern:  /edit/{id}
    defaults:
        _controller: AcmeCompanyBundle:Events:edit
        activeMenu: conferences_events_edit

在控制器的每个动作中我都必须这样做:

$menuBuilder = $this->container->get('acme.menu_builder');
$menuBuilder->setActiveMenu($activeMenu);

如果我能以某种方式拦截匹配的路线并在一个地方而不是在每个操作中调用setActiveMenu(),那就太好了。有什么好的办法吗?

更新:我已经稍微简化了这个例子,这样你就不会被不必要的细节弄糊涂了。

【问题讨论】:

    标签: symfony


    【解决方案1】:

    我猜你需要的是一个控制器监听器

    services.yml

    services:
        acme_controller.listener:
            class: Acme\CompanyBundle\Listener\ControllerListener
            arguments: [ @acme.menu_builder ]
            tags:
                - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
    

    ControllerListener.php

    <?php
    
    namespace Acme\CompanyBundle\Listener;
    
    use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
    
    /**
     * Controller listener
     */
    class ControllerListener
    {
        protected $menuBuilder;
    
        /**
         * Constructor
         *
         * @param Object $menuBuilder A Menu Builder instance
         */
        public function __construct($menuBuilder)
        {
            $this->menuBuilder = $menuBuilder;
        }
    
        /**
         * Sets the active menu
         *
         * @param  FilterControllerEvent $event
         */
        public function onKernelController(FilterControllerEvent $event)
        {
            $controller = $event->getController();
            $request    = $event->getRequest();
    
            /**
             * Your logic
             */
    
            $this->menuBuilder->setActiveMenu($activeMenu);
        }
    }
    

    【讨论】:

    • 是的,谢谢,这正是我所需要的。刚刚发布了我的解决方案,这几乎是一样的。但接受你的安排更好。
    【解决方案2】:

    我终于找到了可能对其他人有用的解决方案。 我们可以监听 kernel.controller 事件:

    acme.kernel_listener:
        class: Acme\Company\Bundle\EventListener\KernelListener
        arguments:
            container: "@service_container"
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
    

    在事件监听器中:

    public function onKernelController(FilterControllerEvent $event)
    {
        $route = $this->container->get('request')->get('_route');
        if ($routeObj = $this->container->get('router')->getRouteCollection()->get($route)) {
            $defaults = $routeObj->getDefaults();
        }
        // do some common stuff
    }
    

    现在我们可以在一个地方完成所有常见的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 2018-10-29
      • 1970-01-01
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多