事件与监听器
简单点说就是 当你执行某个事情(下单)需要处理一个行为(发送给用户下单成功邮件信息),下单的这个行为就是一个行为,当下单成功则通过监听器告诉系统,“我触发了下单行为”,再进行处理相关发送邮箱的逻辑(事件)
这也是一种观察者模式的实现 (https://laravel-china.org/articles/3711/the-practice-of-design-pattern-observer-model)
注册事件监听器
打开
App\Providers\EventServiceProvider
可以看到protected $listen = [ 'App\Events\Event' => [ 'App\Listeners\EventListener', ] ];
$listen
代表的是一个数组 ,key
代表的是监听器value
代表的是事件(消息通知)监听器目录 :
App\Events
消息通知:
App\Listeners
我们可以在
$listen
中添加我们的事件监听器来通过命令php artisan event:generate
自动生成相关文件protected $listen = [ .... 'App\Events\UserUpdate' => [ 'App\Listeners\UpdateUserNotification', ], ];
可以在目录下看到多出了
Events & Listeners
目录也可以通过
php artisan make:event UserUpdate
和php artisan make:notification UpdateUserNotification
创建但必须在
App\Providers\EventServiceProvider
注册相关事件当触发
App\Events\UserUpdate
事件时 会执行UpdateUserNotification
use App\Events; event(new UserUpdate());
使用
我们可以尝试通过事件监听修改一下我们的 用户 名,我已经创建了相关的模型和数据
....... class UserUpdate { use Dispatchable, InteractsWithSockets, SerializesModels; public $user; /** * 创建一个监听器. * * @return void */ public function __construct(User $user) // 将当前要改的用户注入到 监听器中 -- 监听器会通过 EventServiceProvider 自动执行 UpdateUserNotification { $this->user = $user; } } -------------------- .... class UpdateUserNotification { public function __construct() { // } /** * Handle the event. * * @param UserUpdate $event * @return void */ public function handle(UserUpdate $event) // event 就是执行的 UserUpdate 的 $this { $event->user->update([ // 触发更新 'name' => 'abcd' ]); } ..... } ---------------------------- php artisan tinker >>> event(new App\Events\UserUpdate(App\Models\User::find(1))); => [ null, ] >>> App\Models\User::find(1); => App\Models\User {#2875 id: 1, name: "abcd", email: "yvonne.considine@example.org", created_at: "2018-09-25 15:11:54", updated_at: "2018-09-27 06:27:19", } >>>
当然 , 你可以在
$listen
中添加一个value ,它就会执行你指定的第二个事件阻止事件传播的话,你可以在
handler
中返回false
来停止执行
将 事件 推送到 队列中
哈哈哈,很简单
.... use Illuminate\Contracts\Queue\ShouldQueue; class UpdateUserNotification implements ShouldQueue { .... }
引入这个 队列的接口即可,当事件执行后,会自动推送到队列中
当然还可以在当中添加一个自己指定的 队列驱动 and 队列名称
.... /** * 任务将被推送到的连接名称. * * @var string|null */ public $connection = 'sqs'; /** * 任务将被推送到的连接名称. * * @var string|null */ public $queue = 'listeners';
--- 总体而言就是这么多,很简单,
记住,一定要记得分发事件,也就是在EventServiceProvider中 添加相关信息,
在上面有讲到
-- 原创 转载请注明出处
本文由 邓尘锋 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: May 4, 2019 at 11:40 am