11

我为 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 似乎不可扩展,就像 Controller 或 Forms 一样。(以防万一您想知道:当然,我的包是 FOSUserBundle 的子包。)

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

4

1 回答 1

25

只需通过在您的...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%"
        # ...

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

...或最好的方法:

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

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

于 2013-09-11T18:32:21.353 回答