您好,欢迎访问一九零五行业门户网

总结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 两个文件,我们看看其中一个内容:
在两个监听器的 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事件系统用法(监听事件,观察者模式)的详细内容。
其它类似信息

推荐信息