如何覆盖FOSUserBundle的EmailConfirmationListener

时间:2013-09-11 15:17:00

标签: events symfony fosuserbundle event-listener

我为FOSUserBundle激活了用户确认。但我不想接受原始听众的回应

$url = $this->router->generate('fos_user_registration_check_email');
$event->setResponse(new RedirectResponse($url));

我想选择另一条路线。我试图扩展EventListener

namespace Acme\MyBundle\EventListener;

use FOS\UserBundle\EventListener\EmailConfirmationListener as BaseListener;
// ...

class EmailConfirmationListener extends BaseListener
{
    public function onRegistrationSuccess(FormEvent $event)
    {    
        $url = $this->router->generate('fos_user_registration_check_email');
        $event->setResponse(new RedirectResponse($url));
    }
}

不幸的是,EventListener似乎不是可扩展的,就像控制器或表单一样。 (万一你想知道:当然我的捆绑是FOSUserBundle的孩子。)

所以我想避免直接在vendor文件夹中编辑这两行(因为这样做非常糟糕!)。那么我摆脱这场灾难的方法是什么?

1 个答案:

答案 0 :(得分:23)

只需在fos_user.listener.email_confirmation中创建一个名称相同的服务即可覆盖服务config.yml

# app/config/config.yml

services:
    fos_user.listener.email_confirmation:
        class:        "Acme\MyBundle\EventListener\EmailConfirmationListener"
        arguments:    ["@fos_user.mailer", "@fos_user.util.token_generator", "@router", "@session"]
        tags:
            - { name: kernel.event_subscriber }

...甚至更干净 - 创建一个供您的服务使用的参数:

parameters:
    my.funky_parameter.class: "Acme\MyBundle\EventListener\EmailConfirmationListener"

services:
    fos_user.listener.email_confirmation:
        class: "%my.funky_parameter.class%"
        # ...

...或者在bundle的扩展名加载的xml / yml / php配置文件中。选择此方式时,请确保在AppKernel.php中的FOSUserBundle之后注册您的捆绑包。

......或最好的方法:

在编译器传递中更改原始服务的类名,如文档章节How to Override any Part of a Bundle所示。

在选择此选项之前,可能需要深入了解章节How to work with Compiler Passes