Чат Telegram
Группа ВКонтакте
Знакомство с Event и EventSubsriber в Symfony

Знакомство с Event и EventSubsriber в Symfony

В этом уроке мы закончим регистрацию в нашем приложении, познакомившись и применив на практике такой компонент Symfony как события. Если простым языком, события - это любые действия, которые происходят в системе вашего приложения по "вине" пользователя (чаще всего) или чего-то другого. Этими действиями могут быть регистрация, авторизация, новый комментарий, новый лайк, создание поста и проч.

Конечно, по большей части, можно написать какой-нибудь приватный метод или сервис, который применить в конкретном экшене, реагируя на заранее известное вам событие (та же регистрация пользователя), но компонент Symfony, называемый EventDispatcher, позволяет реагировать на абсолютно любые события, выполнять их в определенном порядке (по приоритету) и даже несколько сразу.

События работают следующим образом: у нас есть Event - в нашем случае это зарегистрированный пользователь; и есть EventSubscriber, который подписывается на это событие и отрабатывает, когда оно произошло. Таким образом, когда у нас появится новый зарегистрированный пользователь, подписчик на данное событие отправит письмо на почту для подтверждения регистрации. Давайте приступим!

События, или Events, практически всегда выглядят крайне просто. Например, вот так:

Код доступен только после покупки курса по фреймворку Symfony 4.

Создайте папку Event и положите этот класс туда. Итак, разберем его подробнее:

  1. Событие должно наследоваться от класса Event;
  2. У события есть имя в константе NAME: обычно оно составляется по имени класса (сущность User) и конкретного события (register, deleted, loggedIn, etc);
  3. Событие принимает в конструктор имя сущности и возвращает ее через геттер.

Как видите, ничего сложного. Теперь давайте напишем подписчик на событие. Для этого создайте папку EventSubscriber и создайте там класс UserSubscriber. Данный класс подписывается на любые события, совершенные пользователем, но пока он отслеживает только его регистрацию. Вы не поверите, но выглядит он даже еще проще (пока, по крайней мере), чем само событие:

Код доступен только после покупки курса по фреймворку Symfony 4.

Подписчик должен имплементить интерфейс EventSubscriberInterface, который по контракту требует реализовать метод getSubscribedEvents, в комментарии к которому (если у вас IDE PhpStorm, вы можете легко найти этот интерфейс и сами убедиться) можно увидеть следующее:

Код доступен только после покупки курса по фреймворку Symfony 4.

Так создатели Symfony предлагают реализовать этот метод: он должен возвращать простой массив, ключами которого являются имена событий, а значения - реализованные в этом подписчике методы. Обычно они должны формироваться как "on" + имя события. Именем у нас является "user.register", а значит, метод будет называться onUserRegister. Напомню код еще раз:

Код доступен только после покупки курса по фреймворку Symfony 4.

А метод, собственно, всего лишь вызывает наш сервис по отправке сообщений:

Код доступен только после покупки курса по фреймворку Symfony 4.

Скажите, просто? Осталось совсем немного: запустить событие в контроллере. На прошлом уроке мы написали следующий экшен:

Код доступен только после покупки курса по фреймворку Symfony 4.

Нам надо его переписать, используя события. Для начала удаляем сервис Mailer из аргументов метода: он нам больше не нужен. Также удаляем строку

Код доступен только после покупки курса по фреймворку Symfony 4.

Вместо Mailer инжектим следующее EventDispatcherInterface $eventDispatcher и добавляем следующие две строки в конец:

Код доступен только после покупки курса по фреймворку Symfony 4.

Создаем эвент, который принимает пользователя, потом вызываем метод dispatch встроенного класса EventDispatcher, принимающий имя события и само событие. Вот так выглядит весь код:

Код доступен только после покупки курса по фреймворку Symfony 4.

Некоторые правки с прошлого урока

На прошлом уроке мы сделали шаблон для отправки на почту при регистрации. Там есть небольшая ошибка: путь на страницу регистрации неполный, а содержит только path часть без хоста. Вот так он выглядит сейчас:

Код доступен только после покупки курса по фреймворку Symfony 4.

Строку со ссылкой на подтверждение надо заменить на следующую:

Код доступен только после покупки курса по фреймворку Symfony 4.

app.request.schemeAndHttpHost - в этой переменной хранится полное имя вашего сайта (http://127.0.0.1:8000).

Итого

Теперь, когда все готово, зарегистрируйтесь в вашем приложении. В tool-bar вы увидите письмо, вы можете нажать на него и выбрать Rendered Content. Собственно, вот и все. Мы познакомились с новым компонентом фреймворка, который может быть необычайно полезным и обязательно будет! В следующем уроке мы сделаем формы входы и выхода.

Онлайн обучение PHP
Путь с полного нуля до джуниора!
Начать бесплатно
Курс программирования на PHP
Подготовка до уровня устройства на работу!
Начать бесплатно
Самый понятный курс PHP
Онлайн-уроки в удобное время!
Начать бесплатно
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
loader
Онлайн-курсы PHP и MySQL
Обучение с полного нуля до уровня джуниора!
Начать бесплатно
loader
Логические задачи с собеседований