将侦听器配置为仅在一个bundle symfony 2中执行

将侦听器配置为仅在一个bundle symfony 2中执行,symfony,Symfony,我们需要配置一个侦听器来检查数据库中的一些寄存器,但是我们只需要在一个包中为其中的每个操作执行此检查操作 我们不想每次在bundle中编写函数时都调用函数,所以我们想做一个侦听器 Symfony是否只允许在一个包中配置侦听器 谢谢。你想得不对。无法将侦听器配置为针对捆绑执行。实际上,监听器只是等待其事件被触发——它是定义何时调用监听器的事件。您真正想要实现的是在控制器中的每个操作之前触发一个事件 您可以执行以下操作:侦听kernel.Controller事件,然后执行以下操作: $control

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

我们不想每次在bundle中编写函数时都调用函数,所以我们想做一个侦听器

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


谢谢。

你想得不对。无法将侦听器配置为针对捆绑执行。实际上,监听器只是等待其事件被触发——它是定义何时调用监听器的事件。您真正想要实现的是在控制器中的每个操作之前触发一个事件

您可以执行以下操作:侦听kernel.Controller事件,然后执行以下操作:

$controller = $event->getController();
if ($controller instanceof mybundlecontroller) {
    // fire custom event e.g. My.db.lookup
}
$event->setController($controller)
然后,您可以有一个单独的侦听器在这种情况下激发


参见文档:

我的案例。。。我使用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 }
阶级

路线

corporation_index_default:
# . . .
corporation_api_default:
# . . .    
corporation_manage_default:
# . . .
在我们的例子中,侦听器只在

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

您可以在包中每个类的顶部调用构造函数中的服务吗?您还可以为每个页面设置一个普通侦听器,然后在该函数的顶部围绕数据库调用包装一个if语句,以便它仅在您在该包中时运行。每次运行一个空函数的开销非常小,这无关紧要。谢谢@WhistRGreg。我喜欢第二种解决方案。我正在尝试找到如何获取捆绑包名称或实例并进行检查。请看格伦·斯文菲尔德的答案。谢谢@Glen,效果不错。我必须先注销会话才能看到更改。但我无法将“MyBundleControl”设置为我的实例控制器名称我尝试MyBundleControl、acme\MyBundleControl、acme\MyBundleControl\Default、MyBundleControl默认值。。。。没有人可以正常工作:(如何从控制器(从$event->getController())获取实例名称?请尝试var_dump(获取类($controller));再次@glen!我获取了类,但不知道为什么它在if条件下找不到实例。因此我将de-if条件更改为:if(获取类($controller[0])=='acme\myBundle\Controller\DefaultController')工作正常。你认为这是一个好的替代方案吗?好吧,我想如果它工作的话,这是一个好的替代方案;),尽管你的功能与:
if($Controller[0]instanceof\acme\myBundle\Controller\DefaultController){…dostuff…
(很抱歉反应太晚)
corporation_api_default:
# . . .
corporation_manage_default:
# . . .