Все привет!
Подскажите для чего, как и когда лучше использовать события?
Кто-то использует события для отправки сообщений, а кто-то делает это напрямую логикой. Кто-то по событием делает синхронизацию таблиц базы данных, обновление значений, присваивания рейтинга пользователю и так далее. В общем применение событий разнообразное. Но немного не понимаю грань между тем когда использовать события и их обработчики, а когда вызывать напрямую методы? Какой код допустимо помещать в обработчики событий?
И ещё один вопрос. Мне необходимо синхронизировать таблицы базы данных разных модулей. С помощью чего это делать? С помощью триггеров mysql? На событиях php? Или каким-то другим способом?
Когда использовать события?
-
- Сообщения: 147
- Зарегистрирован: 2017.11.15, 23:54
Re: Когда использовать события?
Когда ты пишешь компонент и выкладываешь его на гитхаб. Те кто его скачают смогут прикрутить свои обработчики не меняя код твоего компонента в папке vendor. Если кроме тебя никто компонент не пользует - вполне можно обойтись и без событий.myks1992@mail.ru писал(а): ↑2019.06.18, 03:41Подскажите для чего, как и когда лучше использовать события?
Если ты уверен что БД меняться не будет (всегда будет только строго MySQL) - то можно и на триггерах. Иначе юзай события.И ещё один вопрос. Мне необходимо синхронизировать таблицы базы данных разных модулей. С помощью чего это делать? С помощью триггеров mysql? На событиях php? Или каким-то другим способом?
Re: Когда использовать события?
Если после регистрации пользователя в модуле User нужно создать его сущности в разных модулях Shop и Blog и отправить несколько оповещений, то можно:
- Вызвать создание и отправку напрямую в контроллере/сервисе регистрации в User. Получится сильносвязанная каша, если модулей и действий много. Но и при наличии десятка прямых вызовов где-то вылетит ошибка почтового сервиса и цепь прервётся. Придётся каждую строку оборачивать в try/catch.
- Сделать синхронизацию через события. Модуль User кидает UserSignedUp, обработчики ловят его, отправляют письмо "Hello, User!" и запускают создание Buyer в Shop и Author в Blog. Они генерируют BuyerCreated и AuthorCreated. По этим событиям система в фоне отправляет письма "Hello, Buyer!" и "Hello, Author!". При обработке событий в очереди можно повторить попытку отправки через минуту, если в первый раз вылетела ошибка.
Так что события можно кидать в очередь и обработку запускать в фоне. И, как сказали выше, события позволяют добавлять функциональность без изменения кода компонента. Так во втором случае мы получаем независимые модули с синхронизацией через события. Иначе при наличии десятков модулей пришлось бы вписывать десятки прямых вызовов в User.
- Вызвать создание и отправку напрямую в контроллере/сервисе регистрации в User. Получится сильносвязанная каша, если модулей и действий много. Но и при наличии десятка прямых вызовов где-то вылетит ошибка почтового сервиса и цепь прервётся. Придётся каждую строку оборачивать в try/catch.
- Сделать синхронизацию через события. Модуль User кидает UserSignedUp, обработчики ловят его, отправляют письмо "Hello, User!" и запускают создание Buyer в Shop и Author в Blog. Они генерируют BuyerCreated и AuthorCreated. По этим событиям система в фоне отправляет письма "Hello, Buyer!" и "Hello, Author!". При обработке событий в очереди можно повторить попытку отправки через минуту, если в первый раз вылетела ошибка.
Так что события можно кидать в очередь и обработку запускать в фоне. И, как сказали выше, события позволяют добавлять функциональность без изменения кода компонента. Так во втором случае мы получаем независимые модули с синхронизацией через события. Иначе при наличии десятков модулей пришлось бы вписывать десятки прямых вызовов в User.
-
- Сообщения: 147
- Зарегистрирован: 2017.11.15, 23:54
Re: Когда использовать события?
Благодарю за развёрнутый ответ)) Теперь понятно)))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.
-
- Сообщения: 147
- Зарегистрирован: 2017.11.15, 23:54
Re: Когда использовать события?
Благодарю!)masson писал(а): ↑2019.06.18, 05:53Когда ты пишешь компонент и выкладываешь его на гитхаб. Те кто его скачают смогут прикрутить свои обработчики не меняя код твоего компонента в папке vendor. Если кроме тебя никто компонент не пользует - вполне можно обойтись и без событий.myks1992@mail.ru писал(а): ↑2019.06.18, 03:41Подскажите для чего, как и когда лучше использовать события?
Если ты уверен что БД меняться не будет (всегда будет только строго MySQL) - то можно и на триггерах. Иначе юзай события.И ещё один вопрос. Мне необходимо синхронизировать таблицы базы данных разных модулей. С помощью чего это делать? С помощью триггеров mysql? На событиях php? Или каким-то другим способом?