如何覆盖 FOSUserBundle 的电子邮件确认侦听器



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

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

我想选择另一条路线。我试图扩展事件侦听器

namespace AcmeMyBundleEventListener;
use FOSUserBundleEventListenerEmailConfirmationListener 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));
    }
}

不幸的是,事件侦听器似乎不像控制器或窗体那样可扩展。(以防万一你想知道:当然,我的捆绑包是FOSUserBundle的子包。

所以我想避免直接在供应商文件夹中编辑这两行(因为这样做是非常糟糕的做法!那么,我有什么办法摆脱这场灾难呢?

只需通过在config.yml中创建具有相同名称的服务来覆盖服务fos_user.listener.email_confirmation...

# app/config/config.yml
services:
    fos_user.listener.email_confirmation:
        class:        "AcmeMyBundleEventListenerEmailConfirmationListener"
        arguments:    ["@fos_user.mailer", "@fos_user.util.token_generator", "@router", "@session"]
        tags:
            - { name: kernel.event_subscriber }

。甚至更干净 - 创建服务正在使用的参数:

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

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

。或最佳方法:

在编译器传递中更改原始服务的类名,如文档章节如何覆盖捆绑包的任何部分所建议的那样。

在选择此选项之前,也许可以深入了解如何使用编译器传递一章。

最新更新