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

После регистрации пользователя магазина в 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';

Однако оба типа Event не зарегистрированы в глобальном диспетчере событий Symfony, они оба не указаны в debug: event-dispatcher , как показано выше, и поэтому не могут быть прослушаны.

У нас уже есть собственный 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 (несмотря на то, что это не подходит для длинного хвоста)

Все еще безуспешно.

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

Наш 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. создать cronjob, который будет извлекать таблицу sylius_customer за интервал 5 минут или около того, чтобы найти клиентов, которые недавно включили свою учетную запись -> да, это можно сделать, но слишком уродливо

Что-то еще?

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

1 Ответ

0 голосов
/ 01 сентября 2018

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

}
...