Даже с подробными ответами выше, у меня все еще были проблемы с пониманием того, какова реальная разница между использованием контроллера / функций ИЛИ прослушивателя событий.
Одна из вещей, которая была пропущена во всех этих ответах, заключается в том, что использование Events и Event Listeners пригодятся, когда вы не хотите соединять свой код так близко . Каждая функция, класс и т. Д. Должны иметь единую цель.
Допустим, вы получили запрос API от постороннего. В моем случае моя точная проблема с пониманием этой концепции была, когда я получаю вызовы API от Stripe Webhooks.
Цель Stripe Webhooks: скажем, клиент тратит 10 000 долларов на ваш сайт. Ваша стандартная процедура - Аутентификация и Захват. Обновите БД, чтобы отразить их новый статус членства. В идеальном мире, и в случае нашей компании, 999/1000 раз, это идет отлично. Либо их карта будет отклонена на месте, либо платеж проходит. В обоих случаях мы отправляем им электронное письмо с уведомлением.
Но как насчет времени 1/1000, когда пользователь платит, а Stripe возвращает ошибку сбоя карты (что может быть разными)? В нашем случае мы отправляем им письмо по электронной почте и сообщаем им, что биллинг не прошел. Проблема, с которой мы столкнулись, заключается в том, что некоторые БАНКИ расследуют крупные платежи, которые возвращаются как Ошибка, но затем, через несколько минут, банк санкционирует платежи, и платеж фиксируется.
Так что же тут делать? Войдите в полоску Webhooks. Stripe Webhooks попадет на конечную точку API, если произойдет нечто подобное. На самом деле, Stripe Webhooks может использовать ваш API в любое время и в любой момент, когда платеж не был мгновенно подтвержден, получен, или если клиент запрашивает возврат.
Здесь слушатель событий пригодится. Полоса стреляет через POST с информацией о клиенте, а также тип Webhook. Теперь мы обработаем это, обновим базу данных и отправим им успешное письмо.
Но почему бы просто не использовать стандартный маршрут и контроллер?
Причина, по которой мы не просто используем стандартный маршрут и контроллер, заключается в том, что нам нужно либо изменить уже определенные функции, классы и т. Д., Либо создать новую серию классов, которые связаны вместе, например, -> Stripe API Calls Received Обновление БД, Отправка электронной почты. Вместо того, чтобы связывать их вместе, мы используем приемник событий, чтобы сначала принять вызов API, а затем нажать на каждый из этих классов, функций и т. Д., Оставив все несвязанными.
Я искал повсюду, и я думаю, что документация Laravel объясняет это лучше всего. Когда я дал конкретный пример, я наконец понял, какова цель прослушивателя событий:
События служат отличным способом разъединить различные аспекты вашего приложения, поскольку одно событие может иметь несколько слушателей, которые не зависят друг от друга. Например, вы можете отправлять уведомления Slack своему пользователю каждый раз, когда заказ отправлен. Вместо того, чтобы связывать код обработки заказа с кодом уведомления Slack, вы можете вызвать событие OrderShipped, которое слушатель может получить и преобразовать в уведомление Slack.
https://laravel.com/docs/5.6/events