您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

[ Laravel 5.2 文档 ] 服务 -- 事件

2025/9/17 17:39:23发布33次查看
1、简介 laravel事件提供了简单的观察者模式实现,允许你订阅和监听应用中的事件。事件类通常存放在 app/events目录,监听器存放在 app/listeners。
2、注册事件/监听器 laravel 自带的 eventserviceprovider为事件注册提供了方便之所。其中的 listen属性包含了事件(键)和对应监听器(值)数组。如果应用需要,你可以添加多个事件到该数组。例如,让我们添加 podcastwaspurchased事件:
/** * 事件监听器映射 * * @var array */protected $listen = [ 'app\events\podcastwaspurchased' => [ 'app\listeners\emailpurchaseconfirmation', ],];
2.1 生成事件/监听器类 当然,手动为每个事件和监听器创建文件是很笨重的,取而代之地,我们可见简单添加监听器和事件到 eventserviceprovider然后使用 event:generate命令。该命令将会生成罗列在 eventserviceprovider中的所有事件和监听器。当然,已存在的事件和监听器不会被创建:
php artisan event:generate
2.2 手动注册事件 一般我们需要将事件注册到 eventserviceprovider的 $listen数组,此外,我们还可以使用 event门面或者 illuminate\contracts\events\dispatcher契约的具体实现类作为事件分发器手动注册事件:
/** * register any other events for your application. * * @param \illuminate\contracts\events\dispatcher $events * @return void */public function boot(dispatchercontract $events){ parent::boot($events); $events->listen('event.name', function ($foo, $bar) { // });}
使用通配符作为事件监听器
你还可以使用通配符*来注册监听器,从而允许你通过同一个监听器捕获多个事件。通配符监听器接收整个事件数据数组作为参数:
$events->listen('event.*', function (array $data) { //});
3、定义事件 事件类是一个处理与事件相关的简单数据容器,例如,假设我们生成的 podcastwaspurchased事件接收一个eloquent orm对象:
podcast = $podcast; }}
正如你所看到的,该事件类不包含任何特定逻辑,只是一个存放被购买的 podcast对象的容器,如果事件对象被序列化的话,事件使用的 serializesmodelstrait 将会使用 php 的 serialize函数序列化所有 eloquent 模型。
4、定义监听器 接下来,让我们看看我们的示例事件的监听器,事件监听器在 handle方法中接收事件实例, event:generate命令将会自动在 handle方法中导入合适的事件类和类型提示事件。在 handle方法内,你可以执行任何需要的逻辑以响应事件。
podcast... }}
你的事件监听器还可以在构造器中类型提示任何需要的依赖,所有事件监听器通过服务容器解析,所以依赖会自动注入:
use illuminate\contracts\mail\mailer;public function __construct(mailer $mailer){ $this->mailer = $mailer;}
停止事件继续往下传播
有时候,你希望停止事件被传播到其它监听器,你可以通过从监听器的 handle方法中返回 false来实现。
事件监听器队列 需要将事件监听器放到队列?没有比这更简单的了,只需要让监听器类实现 shouldqueue接口即可,通过 artisan 命令 event:generate生成的监听器类已经将接口导入当前命名空间,所有你可以立即拿来使用:
id]; }}
然后,你只需要和正常一样触发该事件,事件被触发后,一个队列任务将通过指定广播驱动自动广播该事件。
6.3 广播数据 如果某个事件被广播,其所有的 public属性都会按照事件负载自动序列化和广播,从而允许你从 javascript 中访问所有 public数据,因此,举个例子,如果你的事件有一个单独的包含 eloquent 模型的 $user属性,广播负载定义如下:
{ user: { id: 1, name: jonathan banks ... }}
然而,如果你希望对广播负载有更加细粒度的控制,可以添加 broadcastwith方法到事件,该方法应该返回你想要通过事件广播的数组数据:
/** * 获取广播数据 * * @return array */public function broadcastwith(){ return ['user' => $this->user->id];}
6.4 自定义事件广播 自定义事件名
默认情况下,广播事件名就是事件类名,因此,如果事件的类名是 app\events\servercreated,对应的广播事件名就是 app\events\servercreated,你可以通过事件类上的 broadcastas方法自定义广播事件名:
/** * 获取广播事件名称 * * @return string */public function broadcastas(){ return 'app.server-created';}
自定义队列
默认情况下,每个被广播的事件都位于配置文件 queue.php中定义的默认队列连接中的默认队列中,你可以通过事件类的 onqueue方法自定义广播事件的队列名称。该方法会返回你期望使用的队列名:
/** * 设置事件所在队列的名称 * * @return string */public function onqueue(){ return 'your-queue-name';}
6.5 消费事件广播 pusher
你可以通过 pusher 的 javascript sdk 方便地使用 pusher驱动消费事件广播。例如,让我们从之前的例子中消费 app\events\servercreated事件:
this.pusher = new pusher('pusher-key');this.pusherchannel = this.pusher.subscribe('user.' + user_id);this.pusherchannel.bind('app\\events\\servercreated', function(message) { console.log(message.user);});
redis
如果你在使用 redis 广播,你将需要编写自己的 redis pub/sub 消费者来接收消息并使用自己选择的 websocket 技术将其进行广播。例如,你可以选择使用 node 编写的流行的 socket.io库。
使用 node 库 socket.io和 ioredis,你可以快速编写事件广播发布所有广播事件:
var app = require('http').createserver(handler);var io = require('socket.io')(app);var redis = require('ioredis');var redis = new redis();app.listen(6001, function() { console.log('server is running!');});function handler(req, res) { res.writehead(200); res.end('');}io.on('connection', function(socket) { //});redis.psubscribe('*', function(err, count) { //});redis.on('pmessage', function(subscribed, channel, message) { message = json.parse(message); io.emit(channel + ':' + message.event, message.data);});
7、事件订阅者 事件订阅者是指那些在类本身中订阅到多个事件的类,从而允许你在单个类中定义一些事件处理器。订阅者应该定义一个 subscribe方法,该方法中传入一个事件分发器实例:
listen( 'app\events\userloggedin', 'app\listeners\usereventlistener@onuserlogin' ); $events->listen( 'app\events\userloggedout', 'app\listeners\usereventlistener@onuserlogout' ); }}
注册一个事件订阅者
订阅者被定义后,可以通过事件分发器进行注册,你可以使用 eventserviceprovider上的 $subcribe属性来注册订阅者。例如,让我们添加 usereventlistener:
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product