如何运用Laravel事件系统实现监听事件和观察者模式?

2026-04-18 09:412阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1554个文字,预计阅读时间需要7分钟。

如何运用Laravel事件系统实现监听事件和观察者模式?

下面是由Laravel教程栏目为大众总结的Laravel事件系统用法(监听事件、观察者模式),希望对需要的朋友有所帮助!

在理解了观察者模式后,我们开始正式学习Laravel的事件系统。Laravel的事件系统提供了简单易用的方式来监听和响应各种事件。

Laravel提供了一个简单的观察者模式实现,允许你将事件绑定到观察者。观察者可以是任何实现了`Illuminate\Events\Listener`接口的类。

下面是一个简单的例子,展示了如何使用Laravel的事件系统:

php// 创建一个事件$event=new Event();

// 注册一个监听器$event->listen('event.name', function ($event) { // 处理事件});

在这个例子中,我们创建了一个名为`Event`的事件,并将其绑定到一个监听器。监听器是一个匿名函数,它将在事件触发时执行。

此外,Laravel还提供了`Observer`类,用于实现观察者模式。以下是一个使用`Observer`的例子:

php// 创建一个观察者$observer=new Observer();

// 注册观察者$observer->observe('event.name');

// 触发事件dispatch('event.name');

在这个例子中,我们创建了一个名为`Observer`的观察者,并将其注册到一个事件上。然后,我们通过`dispatch`函数触发事件。

通过以上方式,你可以轻松地使用Laravel的事件系统来监听和响应各种事件。希望这些信息能帮助你更好地理解和使用Laravel的事件系统。

下面由Laravel教程栏目给大家总结Laravel事件系统用法(监听事件,观察者模式) ,希望对需要的朋友有所帮助!

如何运用Laravel事件系统实现监听事件和观察者模式?

在理解了观察者模式后,我们开始正文

Laravel 的事件提供了一个简单的观察者实现,能够订阅和监听应用中发生的各种事件。事件类保存在 app/Events 目录中,而这些事件的的监听器则被保存在 app/Listeners 目录下。这些目录只有当你使用 Artisan 命令来生成事件和监听器时才会被自动创建。

事件机制是一种很好的应用解耦方式,因为一个事件可以拥有多个互不依赖的监听器。例如,如果你希望每次订单发货时向用户发送一个 Slack 通知。你可以简单地发起一个 OrderShipped 事件,让监听器接收之后转化成一个 Slack 通知,这样你就可以不用把订单的业务代码跟 Slack 通知的代码耦合在一起了。

手动生成一个事件

比如通过 artisan 命令手动生成一个 UserLogin 事件:

php artisan make:event UserLogin

在 app/Events 中就会自动生成一个 UserLogin.php 文件,内容不多,如下:

<?php namespace App\Events; use Illuminate\Broadcasting\Channel;use Illuminate\Queue\SerializesModels;use Illuminate\Broadcasting\PrivateChannel;use Illuminate\Broadcasting\PresenceChannel;use Illuminate\Broadcasting\InteractsWithSockets;use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class UserLogin { use InteractsWithSockets, SerializesModels; /** * Create a new event instance. * * @return void */ public function __construct() { // } /** * Get the channels the event should broadcast on. * * @return Channel|array */ public function broadcastOn() { return new PrivateChannel('channel-name'); } }

定义监听器

一个事件可以被一个或多个监听器监听,也就是观察者模式,我们可以定义多个监听器,当这个事件发生,执行一系列逻辑。

在 EventServiceProvider 的 $listen 中可以定义事件和监听器,如下:

protected $listen = [ 'App\Events\UserLogin' => [ 'App\Listeners\DoSomething1', 'App\Listeners\Dosomething2', ],];

执行 artisan 命令,就可以自动在 app/Lisenter 目录生成监听器。

php artisan event:generate

这个命令也可以自动生成事件,如果没有 UserLogin 这个事件会自动生成,而不需要手动生成。

可以看到 app/Listeners 目录多了 DoSomething1.php 和 DoSomething2.php 两个文件,我们看看其中一个内容:

<?php namespace App\Listeners; use App\Events\UserLogin; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class DoSomething1 { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param UserLogin $event * @return void */ public function handle(UserLogin $event) { info('do something1'); } }

在两个监听器的 handle 方法中我们打印一个日志来测试一下,如代码 handle 方法所示。

分发和触发事件

我们在某个控制器的方法中来分发事件,也就是触发事件,看监听器是否正常工作。

就是一句话:

event(new UserLogin());

然后我们请求这个控制器,观察日志,发现打印了日志:

[2018-06-17 10:04:29] local.INFO: do something1
[2018-06-17 10:04:29] local.INFO: do something2

那么这个事件-监听机制就正常工作了。

队列异步处理

如果某个监听器需要执行的操作比较慢,可以放到消息队列进行异步处理。

比如把上面的 DoSomething1 改成需要放入队列的,只需要 implements ShoulQueue 接口。

class DoSomething1 implements ShouldQueue

也可以指定队列驱动,如下代码。

/** * 任务应该发送到的队列的连接的名称 * * @var string|null */ public $connection = 'redis'; /** * 任务应该发送到的队列的名称 * * @var string|null */ public $queue = 'listeners';

我们再次执行控制器方法。

日志里没有打印 do something1,只有 do something2,但是在 redis 队列里发现了一个名为 queues:default 的列表。

{"job":"Illuminate\\Events\\CallQueuedHandler@call","data":{"class":"App\\Listeners\\DoSomething1","method":"handle","data":"a:1:{i:0;O:20:\"App\\Events\\UserLogin\":1:{s:6:\"socket\";N;}}"},"id":"3D7VDUwueYGtUvsazicWsifwWQxnnLID","attempts":1}

这个时候需要使用 php artisan queue:work 执行队列任务,才是真正执行 DoSomething1 这个监听器的 handle 方法。

更多laravel相关技术文章,请访问laravel框架教程栏目!

以上就是总结Laravel事件系统用法(监听事件,观察者模式)的详细内容,更多请关注自由互联其它相关文章!

本文共计1554个文字,预计阅读时间需要7分钟。

如何运用Laravel事件系统实现监听事件和观察者模式?

下面是由Laravel教程栏目为大众总结的Laravel事件系统用法(监听事件、观察者模式),希望对需要的朋友有所帮助!

在理解了观察者模式后,我们开始正式学习Laravel的事件系统。Laravel的事件系统提供了简单易用的方式来监听和响应各种事件。

Laravel提供了一个简单的观察者模式实现,允许你将事件绑定到观察者。观察者可以是任何实现了`Illuminate\Events\Listener`接口的类。

下面是一个简单的例子,展示了如何使用Laravel的事件系统:

php// 创建一个事件$event=new Event();

// 注册一个监听器$event->listen('event.name', function ($event) { // 处理事件});

在这个例子中,我们创建了一个名为`Event`的事件,并将其绑定到一个监听器。监听器是一个匿名函数,它将在事件触发时执行。

此外,Laravel还提供了`Observer`类,用于实现观察者模式。以下是一个使用`Observer`的例子:

php// 创建一个观察者$observer=new Observer();

// 注册观察者$observer->observe('event.name');

// 触发事件dispatch('event.name');

在这个例子中,我们创建了一个名为`Observer`的观察者,并将其注册到一个事件上。然后,我们通过`dispatch`函数触发事件。

通过以上方式,你可以轻松地使用Laravel的事件系统来监听和响应各种事件。希望这些信息能帮助你更好地理解和使用Laravel的事件系统。

下面由Laravel教程栏目给大家总结Laravel事件系统用法(监听事件,观察者模式) ,希望对需要的朋友有所帮助!

如何运用Laravel事件系统实现监听事件和观察者模式?

在理解了观察者模式后,我们开始正文

Laravel 的事件提供了一个简单的观察者实现,能够订阅和监听应用中发生的各种事件。事件类保存在 app/Events 目录中,而这些事件的的监听器则被保存在 app/Listeners 目录下。这些目录只有当你使用 Artisan 命令来生成事件和监听器时才会被自动创建。

事件机制是一种很好的应用解耦方式,因为一个事件可以拥有多个互不依赖的监听器。例如,如果你希望每次订单发货时向用户发送一个 Slack 通知。你可以简单地发起一个 OrderShipped 事件,让监听器接收之后转化成一个 Slack 通知,这样你就可以不用把订单的业务代码跟 Slack 通知的代码耦合在一起了。

手动生成一个事件

比如通过 artisan 命令手动生成一个 UserLogin 事件:

php artisan make:event UserLogin

在 app/Events 中就会自动生成一个 UserLogin.php 文件,内容不多,如下:

<?php namespace App\Events; use Illuminate\Broadcasting\Channel;use Illuminate\Queue\SerializesModels;use Illuminate\Broadcasting\PrivateChannel;use Illuminate\Broadcasting\PresenceChannel;use Illuminate\Broadcasting\InteractsWithSockets;use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class UserLogin { use InteractsWithSockets, SerializesModels; /** * Create a new event instance. * * @return void */ public function __construct() { // } /** * Get the channels the event should broadcast on. * * @return Channel|array */ public function broadcastOn() { return new PrivateChannel('channel-name'); } }

定义监听器

一个事件可以被一个或多个监听器监听,也就是观察者模式,我们可以定义多个监听器,当这个事件发生,执行一系列逻辑。

在 EventServiceProvider 的 $listen 中可以定义事件和监听器,如下:

protected $listen = [ 'App\Events\UserLogin' => [ 'App\Listeners\DoSomething1', 'App\Listeners\Dosomething2', ],];

执行 artisan 命令,就可以自动在 app/Lisenter 目录生成监听器。

php artisan event:generate

这个命令也可以自动生成事件,如果没有 UserLogin 这个事件会自动生成,而不需要手动生成。

可以看到 app/Listeners 目录多了 DoSomething1.php 和 DoSomething2.php 两个文件,我们看看其中一个内容:

<?php namespace App\Listeners; use App\Events\UserLogin; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class DoSomething1 { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param UserLogin $event * @return void */ public function handle(UserLogin $event) { info('do something1'); } }

在两个监听器的 handle 方法中我们打印一个日志来测试一下,如代码 handle 方法所示。

分发和触发事件

我们在某个控制器的方法中来分发事件,也就是触发事件,看监听器是否正常工作。

就是一句话:

event(new UserLogin());

然后我们请求这个控制器,观察日志,发现打印了日志:

[2018-06-17 10:04:29] local.INFO: do something1
[2018-06-17 10:04:29] local.INFO: do something2

那么这个事件-监听机制就正常工作了。

队列异步处理

如果某个监听器需要执行的操作比较慢,可以放到消息队列进行异步处理。

比如把上面的 DoSomething1 改成需要放入队列的,只需要 implements ShoulQueue 接口。

class DoSomething1 implements ShouldQueue

也可以指定队列驱动,如下代码。

/** * 任务应该发送到的队列的连接的名称 * * @var string|null */ public $connection = 'redis'; /** * 任务应该发送到的队列的名称 * * @var string|null */ public $queue = 'listeners';

我们再次执行控制器方法。

日志里没有打印 do something1,只有 do something2,但是在 redis 队列里发现了一个名为 queues:default 的列表。

{"job":"Illuminate\\Events\\CallQueuedHandler@call","data":{"class":"App\\Listeners\\DoSomething1","method":"handle","data":"a:1:{i:0;O:20:\"App\\Events\\UserLogin\":1:{s:6:\"socket\";N;}}"},"id":"3D7VDUwueYGtUvsazicWsifwWQxnnLID","attempts":1}

这个时候需要使用 php artisan queue:work 执行队列任务,才是真正执行 DoSomething1 这个监听器的 handle 方法。

更多laravel相关技术文章,请访问laravel框架教程栏目!

以上就是总结Laravel事件系统用法(监听事件,观察者模式)的详细内容,更多请关注自由互联其它相关文章!