Когда использовать события?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Когда использовать события?

Сообщение myks1992@mail.ru »

Все привет!

Подскажите для чего, как и когда лучше использовать события?

Кто-то использует события для отправки сообщений, а кто-то делает это напрямую логикой. Кто-то по событием делает синхронизацию таблиц базы данных, обновление значений, присваивания рейтинга пользователю и так далее. В общем применение событий разнообразное. Но немного не понимаю грань между тем когда использовать события и их обработчики, а когда вызывать напрямую методы? Какой код допустимо помещать в обработчики событий?

И ещё один вопрос. Мне необходимо синхронизировать таблицы базы данных разных модулей. С помощью чего это делать? С помощью триггеров mysql? На событиях php? Или каким-то другим способом?
masson
Сообщения: 545
Зарегистрирован: 2012.07.03, 15:59

Re: Когда использовать события?

Сообщение masson »

myks1992@mail.ru писал(а): 2019.06.18, 03:41Подскажите для чего, как и когда лучше использовать события?
Когда ты пишешь компонент и выкладываешь его на гитхаб. Те кто его скачают смогут прикрутить свои обработчики не меняя код твоего компонента в папке vendor. Если кроме тебя никто компонент не пользует - вполне можно обойтись и без событий.
И ещё один вопрос. Мне необходимо синхронизировать таблицы базы данных разных модулей. С помощью чего это делать? С помощью триггеров mysql? На событиях php? Или каким-то другим способом?
Если ты уверен что БД меняться не будет (всегда будет только строго MySQL) - то можно и на триггерах. Иначе юзай события.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Когда использовать события?

Сообщение ElisDN »

Если после регистрации пользователя в модуле User нужно создать его сущности в разных модулях Shop и Blog и отправить несколько оповещений, то можно:

- Вызвать создание и отправку напрямую в контроллере/сервисе регистрации в User. Получится сильносвязанная каша, если модулей и действий много. Но и при наличии десятка прямых вызовов где-то вылетит ошибка почтового сервиса и цепь прервётся. Придётся каждую строку оборачивать в try/catch.

- Сделать синхронизацию через события. Модуль User кидает UserSignedUp, обработчики ловят его, отправляют письмо "Hello, User!" и запускают создание Buyer в Shop и Author в Blog. Они генерируют BuyerCreated и AuthorCreated. По этим событиям система в фоне отправляет письма "Hello, Buyer!" и "Hello, Author!". При обработке событий в очереди можно повторить попытку отправки через минуту, если в первый раз вылетела ошибка.

Так что события можно кидать в очередь и обработку запускать в фоне. И, как сказали выше, события позволяют добавлять функциональность без изменения кода компонента. Так во втором случае мы получаем независимые модули с синхронизацией через события. Иначе при наличии десятков модулей пришлось бы вписывать десятки прямых вызовов в User.
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Когда использовать события?

Сообщение myks1992@mail.ru »

ElisDN писал(а): 2019.06.18, 10:06 Если после регистрации пользователя в модуле User нужно создать его сущности в разных модулях Shop и Blog и отправить несколько оповещений, то можно:

- Вызвать создание и отправку напрямую в контроллере/сервисе регистрации в User. Получится сильносвязанная каша, если модулей и действий много. Но и при наличии десятка прямых вызовов где-то вылетит ошибка почтового сервиса и цепь прервётся. Придётся каждую строку оборачивать в try/catch.

- Сделать синхронизацию через события. Модуль User кидает UserSignedUp, обработчики ловят его, отправляют письмо "Hello, User!" и запускают создание Buyer в Shop и Author в Blog. Они генерируют BuyerCreated и AuthorCreated. По этим событиям система в фоне отправляет письма "Hello, Buyer!" и "Hello, Author!". При обработке событий в очереди можно повторить попытку отправки через минуту, если в первый раз вылетела ошибка.

Так что события можно кидать в очередь и обработку запускать в фоне. И, как сказали выше, события позволяют добавлять функциональность без изменения кода компонента. Так во втором случае мы получаем независимые модули с синхронизацией через события. Иначе при наличии десятков модулей пришлось бы вписывать десятки прямых вызовов в User.
Благодарю за развёрнутый ответ)) Теперь понятно)))
myks1992@mail.ru
Сообщения: 147
Зарегистрирован: 2017.11.15, 23:54

Re: Когда использовать события?

Сообщение myks1992@mail.ru »

masson писал(а): 2019.06.18, 05:53
myks1992@mail.ru писал(а): 2019.06.18, 03:41Подскажите для чего, как и когда лучше использовать события?
Когда ты пишешь компонент и выкладываешь его на гитхаб. Те кто его скачают смогут прикрутить свои обработчики не меняя код твоего компонента в папке vendor. Если кроме тебя никто компонент не пользует - вполне можно обойтись и без событий.
И ещё один вопрос. Мне необходимо синхронизировать таблицы базы данных разных модулей. С помощью чего это делать? С помощью триггеров mysql? На событиях php? Или каким-то другим способом?
Если ты уверен что БД меняться не будет (всегда будет только строго MySQL) - то можно и на триггерах. Иначе юзай события.
Благодарю!)
Закрыто