После регистрации пользователя магазина в 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 всегда будут игнорироваться.
Короче говоря, я пробовал несколько подходов и думаю о другом (даже о том, что было бы очень некрасиво):
Есть идеи, как решить нашу проблему?






Пробовал код ниже и успешно получил сообщение дампа после открытия ссылки для подтверждения (в моем случае это был 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');
}
}
Событие sylius.user.post_email_verification действительно есть в списке