即使有了上面的详细答案,我仍然无法理解使用控制器/函数或事件侦听器之间的实际区别。
所有这些答案中遗漏的一件事是,当您不想将代码如此紧密地耦合时,使用事件和 事件侦听器会派上用场。每个函数、类等都应该有单一的目的。
假设您受到来自外人的 API 请求的打击。就我而言,我理解这个概念的确切问题是当我从 Stripe Webhooks 接收 API 调用时。
Stripe Webhooks 的目的是:假设客户在您的网站上花费了 10,000 美元。您的标准程序是 Auth 和 Capture。更新数据库以反映他们的新会员状态。在一个完美的世界里,在我们公司的情况下,999/1000 次,这很完美。他们的卡要么被当场拒绝,要么付款通过。在这两种情况下,我们都会向他们发送一封电子邮件,让他们知道。
但是当用户付款并且 Stripe 返回 Card Failure 错误(可能是许多不同的事情)的 1/1000 时间呢?在我们的案例中,我们向他们发送电子邮件并告诉他们计费失败。我们遇到的问题是,一些银行正在调查大笔收费,这作为错误返回,但几分钟后银行授权收费并捕获付款。
那么有什么办法呢?输入 Stripe Webhook。如果发生这种情况,Stripe Webhooks 将访问 API 端点。实际上,每当付款未立即进行身份验证、捕获或客户要求退款时,Stripe Webhooks 都可以访问您的 API。
这就是事件监听器派上用场的地方。 Stripe 使用客户信息和 Webhook 类型在 POST 上进行拍摄。我们现在将处理它,更新数据库,并向他们发送一封成功的电子邮件。
但为什么不直接使用标准路由和控制器呢?
我们不只是使用标准路由和控制器的原因是因为我们要么需要修改已经定义的函数、类等,要么创建一系列耦合在一起的新类,例如 -> Stripe API Calls Received ,更新数据库,发送电子邮件。我们不是将它们紧密耦合在一起,而是使用事件侦听器首先接受 API 调用,然后点击其中的每个类、函数等,使所有内容都分离。
我到处寻找,我认为 Laravel 文档解释得最好。给出一个具体的例子,我终于明白了,事件监听器的目的是什么:
事件是解耦应用程序各个方面的好方法,因为单个事件可以有多个互不依赖的侦听器。例如,您可能希望在每次订单发货时向您的用户发送 Slack 通知。您可以引发 OrderShipped 事件,而不是将订单处理代码与 Slack 通知代码耦合,侦听器可以接收该事件并将其转换为 Slack 通知。
https://laravel.com/docs/5.6/events