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));
    }
}

残念ながら、コントローラーやフォームと同様に、EventListeners は拡張可能ではないようです。(念のため: もちろん、私のバンドルは FOSUserBundle の子です。)

そのため、vendor フォルダーでこれらの 2 行を直接編集することは避けたいと思います (そうするのは非常に悪い習慣です!)。では、この災難から抜け出す方法は何ですか?

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 の後に登録されていることを確認してください。

...または最良の方法:

ドキュメントの章「バンドルの一部をオーバーライドする方法」が示唆するように、コンパイラ パスで元のサービスのクラス名を変更します。

このオプションを選択する前に、「コンパイラ パスの使用方法」の章に飛び込んでみてください。

于 2013-09-11T18:32:21.353 に答える