Symfony2:禁用供应商事件监听器

时间:2013-02-14 12:18:45

标签: symfony service listener single-sign-on fosuserbundle

我正在使用的Symfony2应用程序使用SSO和FosUserBundle。但是,有一个FosUserBundle事件侦听器,在用户登录时触发,从而阻止我的SSO捆绑工作。

我的app/config/config.yml中是否有办法可以轻松禁用此特定的FosUserBundle侦听器?

PS。听众是FOS\UserBundle\EventListener\LastLoginListener::onSecurityInteractiveLogin

3 个答案:

答案 0 :(得分:3)

您可以替换服务定义并使用具有相同接口但不执行任何操作的存根类。

services:
    acme.menu.adaptor:
        class: MyProject\Helper\NullMenuAdapter
        tags:
            -  { name: 'acme.menu.adaptor' }

有时,如果服务依赖于标签,您可以删除标签:

services:
    acme.menu.adaptor:
        class: Acme\Helper\RealMenuAdapter
#        tags:
#            -  { name: 'acme.menu.adaptor' }

答案 1 :(得分:2)

浏览EventDispatcher代码,我看不到在config.yml中禁用一个特定侦听器的简单方法。

您可以做的一件事是使用您自己的类扩展LastLoginListener,将参数fos_user.security.interactive_login_listener.class(请参阅https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/config/security.xml)设置为您的扩展类,并使用类似的内容覆盖getSubscribedEvents()以下内容:

public static function getSubscribedEvents()
{
    return array(
        FOSUserEvents::SECURITY_IMPLICIT_LOGIN => 'onImplicitLogin',
    );
}

因此删除了SecurityEvents::INTERACTIVE_LOGIN事件的订阅。

不确定这是否是最干净的方法,但它可能是需要最少行代码的方法。

编辑:

为了进一步详细说明我的答案,我认为无法通过配置文件禁用特定侦听器方法的原因是因为LastLoginListener使用kernel.event_subscriber标记来指示它正在侦听自定义事件。

Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\RegisterKernelListenersPass类使用kernel.event_subscriber标记调用每个服务上的getSubscribedEvents()方法,然后为所有返回的类+回调添加事件订阅。

在设置此代码的代码中没有任何地方似乎存在任何覆盖。

我的所有这些都是基于查看代码,所以我可能会错过任何一个选项。

答案 2 :(得分:2)

我要说捆绑包的责任是提供禁用其某些行为的配置。

因此,如果不是这样,请进行更改(默认情况下启用事件侦听器)并发送PR:)

以下是通过配置启用/禁用的一些示例:https://github.com/KnpLabs/KnpRadBundle/blob/develop/DependencyInjection/KnpRadExtension.php#L27-L57

使用相应的配置:https://github.com/KnpLabs/KnpRadBundle/blob/develop/DependencyInjection/Configuration.php#L32-L38