• Laravel 的事件监听器与服务提供者和服务容器的二三事


    一. Laravel 的事件监听器与服务提供者和服务容器有密切的关系。

    服务提供者用于注册服务、绑定依赖关系以及执行框架的初始化设置。在服务提供者的 register 方法中,可以注册事件和事件监听器。

    服务容器则负责管理对象的创建和依赖注入。事件监听器通常会被注册到服务容器中,以便在需要时能够正确地实例化和调用。

    例如,当某个事件被触发时,Laravel 会通过服务容器获取对应的事件监听器实例,并执行其处理逻辑。

    通过服务提供者将事件和监听器与服务容器进行关联和配置,使得整个框架能够高效地处理事件驱动的逻辑。

    案例:

    比如有个 UserRegistered 事件,表示用户注册成功。在服务提供者中,可以这样注册监听器:
    1. public function register()
    2. {
    3. Event::listen(UserRegistered::class, [UserRegisteredListener::class, 'handle']);
    4. }

    当 UserRegistered 事件被触发时,服务容器会实例化 UserRegisteredListener 并调用 handle 方法来处理事件。

    再比如说,假设我们有一个 OrderPlaced 事件,表示订单已被下单。

    首先创建事件类 OrderPlaced

    1. namespace App\Events;
    2. use Illuminate\Broadcasting\InteractsWithSockets;
    3. use Illuminate\Foundation\Events\Dispatchable;
    4. use Illuminate\Queue\SerializesModels;
    5. class OrderPlaced
    6. {
    7. use Dispatchable, InteractsWithSockets, SerializesModels;
    8. public $order;
    9. public function __construct($order)
    10. {
    11. $this->order = $order;
    12. }
    13. }

    然后创建对应的事件监听器 OrderPlacedListener

    1. namespace App\Listeners;
    2. use App\Events\OrderPlaced;
    3. class OrderPlacedListener
    4. {
    5. public function handle(OrderPlaced $event)
    6. {
    7. // 在此处处理订单下单后的逻辑,比如发送通知邮件
    8. $order = $event->order;
    9. // 具体的处理逻辑
    10. //...
    11. }
    12. }

    在服务提供者 EventServiceProvider 中注册事件和监听器:

    1. namespace App\Providers;
    2. use App\Events\OrderPlaced;
    3. use App\Listeners\OrderPlacedListener;
    4. use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
    5. class EventServiceProvider extends ServiceProvider
    6. {
    7. protected $listen = [
    8. OrderPlaced::class => [
    9. OrderPlacedListener::class
    10. ],
    11. ];
    12. public function boot()
    13. {
    14. parent::boot();
    15. }
    16. }

    当订单下单触发 OrderPlaced 事件时,Laravel 的服务容器会自动实例化 OrderPlacedListener 并调用其 handle 方法来处理相关逻辑。

    再比如,有一个 ArticlePublished 事件,表示文章已发布。

    事件类 ArticlePublished

    1. namespace App\Events;
    2. use Illuminate\Broadcasting\InteractsWithSockets;
    3. use Illuminate\Foundation\Events\Dispatchable;
    4. use Illuminate\Queue\SerializesModels;
    5. class ArticlePublished
    6. {
    7. use Dispatchable, InteractsWithSockets, SerializesModels;
    8. public $article;
    9. public function __construct($article)
    10. {
    11. $this->article = $article;
    12. }
    13. }

    监听器 ArticlePublishedListener

    1. namespace App\Listeners;
    2. use App\Events\ArticlePublished;
    3. class ArticlePublishedListener
    4. {
    5. public function handle(ArticlePublished $event)
    6. {
    7. // 处理文章发布后的逻辑,比如更新相关统计数据
    8. $article = $event->article;
    9. // 具体的处理逻辑
    10. //...
    11. }
    12. }

    在服务提供者中注册:

    1. namespace App\Providers;
    2. use App\Events\ArticlePublished;
    3. use App\Listeners\ArticlePublishedListener;
    4. use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
    5. class EventServiceProvider extends ServiceProvider
    6. {
    7. protected $listen = [
    8. ArticlePublished::class => [
    9. ArticlePublishedListener::class
    10. ],
    11. ];
    12. public function boot()
    13. {
    14. parent::boot();
    15. }
    16. }

    这样,当 ArticlePublished 事件被触发时,服务容器会按照注册的关系来处理相应的逻辑。

    在Laravel中,事件监听器的工作原理基于观察者模式。当一个事件被触发时,Laravel会通知所有注册的监听器,监听器会执行相应的操作。

    二. Laravel中事件监听器的详细工作原理:
    1. 事件的定义:事件是一个类,通常位于app/Events目录下。事件类可以包含与事件相关的数据。
    2. 监听器的定义:监听器是一个类,通常位于app/Listeners目录下。监听器类包含处理事件的逻辑。
    3. 注册事件和监听器:在Laravel中,可以在EventServiceProvider类的$listen属性中注册事件和监听器。$listen属性是一个数组,其中键是事件的名称,值是监听器的类名。
    4. 触发事件:在应用程序的任何地方,可以使用event()函数触发事件。event()函数接受一个事件类的实例作为参数。
    5. 通知监听器:当事件被触发时,Laravel会遍历注册的监听器,并执行每个监听器的handle()方法。handle()方法接受一个事件类的实例作为参数,可以在该方法中处理事件。

    通过使用事件和监听器,可以将应用程序中的不同部分解耦,使得代码更加易于维护和扩展。

    三. 如何在Laravel中定义监听器?

    在 Laravel 中定义监听器,您可以按照以下步骤进行:

    1. 创建监听器类

      • 在 app/Listeners 目录下创建一个新的 PHP 类文件。
      • 例如,创建一个名为 OrderPlacedListener.php 的文件。
    2. 编写监听器类的内容

      • 监听器类需要继承 Illuminate\Contracts\Queue\ShouldQueue 接口(如果您希望监听器在队列中异步处理)或不继承(如果要同步处理)。
      • 类中包含一个 handle 方法,用于处理事件。

    以下是一个简单的同步监听器示例:

    1. namespace App\Listeners;
    2. use App\Events\OrderPlaced;
    3. class OrderPlacedListener
    4. {
    5. /**
    6. * 处理订单放置事件
    7. *
    8. * @param OrderPlaced $event
    9. * @return void
    10. */
    11. public function handle(OrderPlaced $event)
    12. {
    13. // 在这里编写处理事件的逻辑
    14. $order = $event->order;
    15. // 进行相关操作,如发送通知、更新数据库等
    16. }
    17. }

    如果您希望监听器异步处理,示例如下:

    1. namespace App\Listeners;
    2. use App\Events\OrderPlaced;
    3. use Illuminate\Contracts\Queue\ShouldQueue;
    4. class OrderPlacedListener extends ShouldQueue
    5. {
    6. /**
    7. * 处理订单放置事件
    8. *
    9. * @param OrderPlaced $event
    10. * @return void
    11. */
    12. public function handle(OrderPlaced $event)
    13. {
    14. // 异步处理的逻辑
    15. }
    16. }

    这样就完成了一个监听器的定义。然后,您需要在服务提供者中注册这个监听器来使其生效。

    在Laravel中,监听器的生命周期由Laravel框架自动管理。当一个事件被触发时,Laravel会自动查找并执行与该事件相关联的监听器。

    四. 在 Laravel中,监听器的生命周期是如何管理的?

    具体来说,Laravel的事件系统基于观察者模式。当一个事件被触发时,Laravel会通知所有注册的监听器,监听器可以执行相应的操作。监听器可以是一个类或一个闭包函数,它们通过注册到Laravel的事件系统中来接收事件通知。

    在Laravel中,你可以使用以下方式来注册监听器:

    • 在服务提供者的boot方法中注册监听器。
    • 在模型的boot方法中注册监听器。
    • 使用Event::listen方法注册监听器。

    当你注册监听器后,Laravel会在事件被触发时自动执行监听器的代码。监听器的执行顺序是不确定的,但是它们会按照注册的顺序依次执行。

    如果你需要在监听器中执行一些耗时的操作,例如发送邮件或进行数据库操作,你可以将监听器放在队列中异步执行,以提高应用的性能。

    五. 在 Laravel中,监听器的执行顺序是怎样的?

    在 Laravel 中,监听器的执行顺序是不确定的,但是它们会按照注册的顺序依次执行。

    如果你需要在监听器中执行一些耗时的操作,例如发送邮件或进行数据库操作,你可以将监听器放在队列中异步执行,以提高应用的性能。

  • 相关阅读:
    Android Jetpack学习系列——Room
    Windows OpenGL ES 波浪特效
    大数据业务场景
    057_末晨曦Vue技术_处理边界情况之强制更新和创建低开销的静态组件
    Python---类型注解
    图像质量评估——PSNR:峰值信噪比和SSIM:结构相似性(纯手撸代码)
    计算机毕业设计ssm汽车资讯网站wlri7系统+程序+源码+lw+远程部署
    《Python编程:从入门到实践》第二章练习题
    java毕业设计智慧防疫上报系统服务端Mybatis+系统+数据库+调试部署
    Redis_01_Redis安装与使用
  • 原文地址:https://blog.csdn.net/vbgesab/article/details/139815034