Как прослушать событие, когда пользователь магазина отправляет подтверждение по электронной почте в Sylius?

После регистрации пользователя магазина в Sylius в качестве базовой структуры моего веб-приложения пользователь получит электронное письмо со ссылкой для подтверждения.

После того, как пользователь нажимает на это событие, он будет включен в базу данных из-за некоторых волшебных вещей, которые происходят позади Sylius.

Я хочу поймать это событие, чтобы на этом этапе можно было добавить больше действий.

Предпринятые шаги:

Во-первых, я попытался найти событие, которое могло бы сработать в случае успешной аутентификации пользователя.

bin/console debug:event-dispatcher

"sylius.admin_user.post_create" event
"sylius.admin_user.post_update" event
"sylius.admin_user.pre_delete" event
"sylius.admin_user.pre_update" event
"sylius.cart_change" event
"sylius.channel.pre_delete" event
"sylius.customer.post_register" event
"sylius.customer.pre_register" event
"sylius.customer.pre_update" event
"sylius.menu.shop.account" event
"sylius.oauth_user.post_create" event
"sylius.oauth_user.post_update" event
"sylius.oauth_user.pre_delete" event
"sylius.order.post_address" event
"sylius.order.post_complete" event
"sylius.order.post_payment" event
"sylius.order.post_select_shipping" event
"sylius.order.pre_complete" event
"sylius.order_item.pre_create" event
"sylius.order_item.pre_delete" event
"sylius.order_item.pre_update" event
"sylius.product.initialize_update" event
"sylius.product.pre_create" event
"sylius.product.pre_update" event
"sylius.product_review.pre_create" event
"sylius.product_variant.initialize_update" event
"sylius.shipment.post_ship" event
"sylius.shop_user.post_create" event
"sylius.shop_user.post_update" event
"sylius.shop_user.pre_delete" event
"sylius.taxon.pre_create" event
"sylius.taxon.pre_update" event
"sylius.user.email_verification.token" event
"sylius.user.password_reset.request.pin" event
"sylius.user.password_reset.request.token" event
"sylius.user.post_email_verification" event
"sylius.user.pre_password_change" event
"sylius.user.pre_password_reset" event
"sylius.user.security.impersonate" event
"sylius.user.security.implicit_login" event

В нем будет перечислено множество событий, но ничего не будет указывать на какой-либо процесс проверки электронной почты, кроме sylius.user.email_verification.token, который отвечает только за создание окончательного токена аутентификации.

Затем я прошел через код Sylius и нашел UserController и действие verifyAction, что звучит многообещающе.

В рамках этого действия отправляется несколько событий:

$eventDispatcher->dispatch(UserEvents::PRE_EMAIL_VERIFICATION, new GenericEvent($user));

и

$eventDispatcher->dispatch(UserEvents::POST_EMAIL_VERIFICATION, new GenericEvent($user));

Эти константы определены как:

public const PRE_EMAIL_VERIFICATION = 'sylius.user.pre_email_verification';
public const POST_EMAIL_VERIFICATION = 'sylius.user.post_email_verification';

Однако оба типа событий не зарегистрированы в глобальном диспетчере событий symfony, они оба не указаны с отладка: диспетчер событий, как показано ранее, и поэтому их нельзя прослушивать.

У нас уже есть собственный EventLister, который хорошо работает для процесса регистрации, но он не будет улавливать никаких событий проверки электронной почты:

/**
 * {@inheritdoc}
 */
public static function getSubscribedEvents()
{
    return [
        'sylius.customer.pre_register' => ['onCustomerPreRegister', 0],
        'sylius.customer.post_register' => ['onCustomerPostRegister', 0],
        UserEvents::POST_EMAIL_VERIFICATION => ['onPostEmailVerification', 0]
    ];
}

Затем я попытался перезаписать UserController в собственной реализации, переопределив исходный контроллер и дублируя метод verifyAction (несмотря на то, что это не было бы хорошим вариантом для длинного хвоста)

По-прежнему безуспешно.

Хотя мы успешно переопределили несколько контроллеров, кажется, что UserController находится на острове, который нельзя изменить на другой класс:

Наш services.yml выглядит так:

sylius.controller.shop_user:
    class: AppBundle\Controller\User\UserController
    public: true

sylius.controller.shop.homepage:
    class: AppBundle\Controller\Shop\HomepageController
    public: true

Пользовательский контроллер для домашней страницы работает нормально, в то время как любые записи для UserController всегда будут игнорироваться.

Возможные решения:

Короче говоря, я пробовал несколько подходов и думаю о другом (даже о том, что было бы очень некрасиво):

  1. слушать соответствующие события -> нет шансов
  2. перезаписать UserController -> нет шансов или сделал это неправильно
  3. создать задание cron, которое будет извлекать sylius_customer-table с интервалом в 5 минут или около того, чтобы найти клиентов, которые недавно активировали свою учетную запись -> да, можно сделать, но это тоже уродливо

Что-то другое?

Есть идеи, как решить нашу проблему?

Событие sylius.user.post_email_verification действительно есть в списке

Fabien Papet 31.08.2018 23:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
701
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пробовал код ниже и успешно получил сообщение дампа после открытия ссылки для подтверждения (в моем случае это был http: //localhost/app_dev.php/en_US/verify/mUJjxjiI0OjWhRC2)

<?php

namespace AppBundle\EventListener;

use Sylius\Bundle\UserBundle\UserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\GenericEvent;

class CustomVerificationSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            UserEvents::POST_EMAIL_VERIFICATION => 'onVerification'
        ];
    }

    public function onVerification(GenericEvent $event)
    {
        dump('it works');
    }

}

Другие вопросы по теме