配置一个监听器仅在一个bundle中执行,Symfony 2。

4
我们需要配置一个监听器来检查数据库中的一些寄存器,但我们只需要在其中一个bundle中执行此检查操作。
我们不希望每次编写bundle中的函数时都调用一次函数,因此我们考虑使用监听器。
Symfony是否允许仅在一个bundle中配置监听器?
谢谢。

你能在每个捆绑包类的构造函数顶部调用一个服务吗? - greg
你还可以为每个页面设置一个普通的监听器,然后在该函数顶部包装一个 if 语句来限制仅在该绑定内运行数据库调用。每次运行空函数的开销非常小,几乎可以忽略不计。 - greg
谢谢@whistlergreg。我喜欢第二个解决方案。我正在尝试找到如何获取捆绑包名称或实例并进行检查。请参考Glen-Swinfield的答案。 - Santi
2个回答

4
您的思路有误。您不能配置一个监听器来执行一个bundle。实际上,监听器只是等待其事件被触发 - 是事件定义了何时调用监听器。您真正想要实现的是在控制器中的每个操作之前触发一个事件。
您可以通过监听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


谢谢@glen,它可以正常工作。我必须先注销会话才能看到更改。 但是我无法将“mybundlecontroller”设置为我的实例控制器名称 我尝试了myBundleController、acme\myBundleController、acme\myBundleController\Default、myBundleControllerDefault等等。 没有一个可以正常工作 :( - Santi
我该如何从控制器中获取实例名称(从$event->getController()获得)? - Santi
那么bundle呢?我们能否像这样使用if (... instanceof someBundleName()) {}?因为设置每个控制器需要很多冗余代码 =\ - user1954544
简单地将所有bundle的控制器从某个类或接口扩展:interface Bundle1Controller {}; class MyController implements Bundle1Controller,然后在监听器中检查这个:if($controller instanceof Bundle1Controller) {}。请注意:$event->getController()通常返回数组,如果是这样,请使用$controller[0]。 :) - vp_arth
请只翻译文本内容,不要进行解释:并且很好的解释在原回答中,谢谢@GlenSwinfield,我真的想错了。 - vp_arth
显示剩余3条评论

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:
# . . .

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接