4

我们需要配置一个侦听器来检查数据库中的一些寄存器,但我们只需要在一个包中为其中的每个操作执行此检查操作。

我们不想每次在包中编写函数时都调用函数,所以我们考虑做一个监听器。

Symfony 是否只允许在一个包中配置监听器?

谢谢。

4

2 回答 2

4

你想错了。您不能配置侦听器来为捆绑执行。在实践中,侦听器只是等待其事件被触发——它是定义何时调用侦听器的事件。您真正想要实现的是在控制器中的每个操作之前触发一个事件。

您可以这样做购买监听 kernel.Controller 事件,然后执行以下操作:

$controller = $event->getController();
if ($controller instanceof mybundlecontroller) {
    // fire custom event e.g. My.db.lookup
}
$event->setController($controller)

然后,您可以有一个单独的侦听器在这种情况下触发。

请参阅文档:http ://symfony.com/doc/current/book/internals.html#kernel-controller-event

于 2012-05-31T18:02:05.567 回答
0

我的情况...我使用 event.controller,路由帮助我“使用监听器进行自定义路由”

服务

    kernel.listener.corporation.manage:
        class:  Site\CorporationBundle\Event\SiteCorporationManageListener
        arguments: ["@doctrine.orm.entity_manager"]
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }

班级

class SiteCorporationManageListener
{
    private $oEntityManager = null;

    public function __construct(EntityManager $oEntityManager)
    {
        $this->oEntityManager = $oEntityManager;
    }

    public function onKernelController(FilterControllerEvent $event)
    {
        if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) {
            // get variable from url if needed
            // $event->getRequest()->get('urlVariable', null); 
            $route = $event->getRequest()->get('_route');

            if (strstr($route, 'corporation')) {
                if (!strstr($route, 'corporation_index')) {
                    echo 'some request done';
                }
            }
        }
    }
}

路线

corporation_index_default:
# . . .
corporation_api_default:
# . . .    
corporation_manage_default:
# . . .

在我们的例子中,监听器只能在

corporation_api_default:
# . . .
corporation_manage_default:
# . . .
于 2013-10-01T22:10:25.127 回答