Как переопределить FOSUserBundle EmailConfirmationListener

Я активировал подтверждение пользователя для 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.)

Поэтому я хочу избежать редактирования этих двух строк непосредственно в папке поставщика (так как это было бы очень плохой практикой!). Итак, каковы мои пути из этого бедствия?

Ответ 1

Просто переопределите службу 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 пакета, загруженного расширением пакета. Убедитесь, что ваш пакет регистрируется после FOSUserBundle в AppKernel.php при выборе этого способа.

... или лучший метод:

измените имя исходного класса сервиса в проходе компилятора, как предлагает глава документации Как переопределить любую часть пакета.

Возможно, перед тем, как выбрать эту опцию, сделайте погружение в раздел Как работать с проходами компилятора.