Как правильно делать события в Yii2?

Добрый день,

хочу сделать событием отправку почты после регистрации.
Сделаю событие.

namespace app\event;

use yii\base\Component;
use yii\base\Event;

class MessageEvent extends Event
{
    public $message;
    
    public function send($message)
    {
        return \Yii::$app->get('mailer')->compose(['html' => 'actiovationAuthKey-text'], ['user' => ['first_name' => 'asdfasdfsa'])
                        ->setFrom([\Yii::$app->params['supportEmail'] => \Yii::$app->name . ' robot'])
                        ->setTo('test@mail.ru')
                        ->setSubject('$message)
                        ->send();
    }
   
}


и после валидации и сохранения пользователя делаю вызов и тригер.
$event = new app\event\MessageEvent;
                $event->message = 'sadf';
                $this->trigger(self::EVENT_MESSAGE_SENT, $event);


Подскажите что не так делаю? ошибок нет да и сообщение не пришло) вот и гадаю, спасибо за помощь. Прошу прощения, первый опыт с событиями.
  • Вопрос задан
  • 2073 просмотра
Решения вопроса 1
iiifx
@iiifx
PHP, OOP, SOLID, Yii2, Composer, PHPStorm
В вашем случае нет той части, которая подписана на событие. Вы его возбуждаете, но его никто не слушает.

Вот ваш пример, только через глобальные события:
class MessageSendEvent extends Event
{
    const EVENT_MESSAGE_SEND = 'message-send-event';

    /**
     * @var string
     */
    public $message;

    /**
     * ...
     */
    public function send ()
    {
        echo $this->message;
    }
}

Теперь подписываемся и "слушаем" событие:
# Вешаем обработчик события
Yii::$app->on( MessageSendEvent::EVENT_MESSAGE_SEND, function ( MessageSendEvent $event ) {
    $event->send();
} );

И в нужный момент возбуждаем его:
# Инициируем событие
Yii::$app->trigger(
    MessageSendEvent::EVENT_MESSAGE_SEND,
    new MessageSendEvent( [
        'message' => 'Сообщение!'
    ] )
);


Но блин, у вас тут такой оверхед, что подобный пример нет смысла использовать. Проще вызвать самому ->send() и все, без всяких там событий.

UPD: Объект Event, он по сути является носителем данных. Сам он НЕ должен выполнять работу. Он лишь должен доставить нужные данные воркеру, а воркер содержит всю логику.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы