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

2024-06-20 00:04

本文主要是介绍Laravel 的事件监听器与服务提供者和服务容器的二三事,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

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

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

案例:

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

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

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

首先创建事件类 OrderPlaced

<?phpnamespace App\Events;use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;class OrderPlaced
{use Dispatchable, InteractsWithSockets, SerializesModels;public $order;public function __construct($order){$this->order = $order;}
}

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

<?phpnamespace App\Listeners;use App\Events\OrderPlaced;class OrderPlacedListener
{public function handle(OrderPlaced $event){// 在此处处理订单下单后的逻辑,比如发送通知邮件$order = $event->order;// 具体的处理逻辑//...}
}

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

<?phpnamespace App\Providers;use App\Events\OrderPlaced;
use App\Listeners\OrderPlacedListener;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;class EventServiceProvider extends ServiceProvider
{protected $listen = [OrderPlaced::class => [OrderPlacedListener::class],];public function boot(){parent::boot();}
}

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

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

事件类 ArticlePublished

<?phpnamespace App\Events;use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;class ArticlePublished
{use Dispatchable, InteractsWithSockets, SerializesModels;public $article;public function __construct($article){$this->article = $article;}
}

监听器 ArticlePublishedListener

<?phpnamespace App\Listeners;use App\Events\ArticlePublished;class ArticlePublishedListener
{public function handle(ArticlePublished $event){// 处理文章发布后的逻辑,比如更新相关统计数据$article = $event->article;// 具体的处理逻辑//...}
}

在服务提供者中注册:

<?phpnamespace App\Providers;use App\Events\ArticlePublished;
use App\Listeners\ArticlePublishedListener;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;class EventServiceProvider extends ServiceProvider
{protected $listen = [ArticlePublished::class => [ArticlePublishedListener::class],];public function boot(){parent::boot();}
}

这样,当 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 方法,用于处理事件。

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

<?phpnamespace App\Listeners;use App\Events\OrderPlaced;class OrderPlacedListener
{/*** 处理订单放置事件** @param  OrderPlaced  $event* @return void*/public function handle(OrderPlaced $event){// 在这里编写处理事件的逻辑$order = $event->order;// 进行相关操作,如发送通知、更新数据库等}
}

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

<?phpnamespace App\Listeners;use App\Events\OrderPlaced;
use Illuminate\Contracts\Queue\ShouldQueue;class OrderPlacedListener extends ShouldQueue
{/*** 处理订单放置事件** @param  OrderPlaced  $event* @return void*/public function handle(OrderPlaced $event){// 异步处理的逻辑}
}

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

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

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

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

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

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

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

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

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

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

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

这篇关于Laravel 的事件监听器与服务提供者和服务容器的二三事的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076535

相关文章

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne