Laravel之事件
一.事件
事件无处不在,比如用户登录、购买商品、搜索、查看文章,等等,都是事件,有了事件,就有事件监听器,事件监听器监听到事件发生后会执行一些操作,Laravel使用观察者模式来实现这种监听机制。本节我们通过一个简单的示例来讲述在Laravel中如何创建事件类、事件对应的监听器类,以及监听器如何监听事件发生并执行相应操作。
这里我们实现一个添加任务后后写入日志的事件
二.注册事件-监听器
1.我们需要在EventServiceProvider中注册事件与监听器之间的映射关系:
protected $listen = [
'App\Events\TaskAdded'=>[
'App\Listeners\SaveTaskToLogListener'
]
];
2.生成事件
php artisan event:generate
该命令会在app/Events目录下生成TaskAdded.php,在app/Listeners目录下生成SaveTaskToLogListener.php。
三.定义事件类TaskAdded.class
<?php namespace App\Events; use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use App\Models\Task; class TaskAdded extends Event
{
use SerializesModels;
public $task; /**
* TaskAdded constructor.
* 构造函数,注入一个Task实例
* @param Task $task
*/
public function __construct(Task $task)
{
$this->task = $task;
} /**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}
事件类什么都没做,只是注入了一个Task实例
四.事件监听器类SaveTaskToLogListener.php
<?php namespace App\Listeners; use Illuminate\Support\Facades\Log;
use App\Events\TaskAdded;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue; class SaveTaskToLogListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
} /**
* Handle the event.
*
* @param TaskAdded $event
* @return void
*/
public function handle(TaskAdded $event)
{
$task = $event->task;
Log::alert('添加了一个任务', ['id' => $task->id, 'name' => $task->name]);
}
}
五.触发事件
$task = Task::create(['user_id'=>Auth::id(), 'name' => $request->input('name')]);
// 触发事件
Event::fire(new TaskAdded($task));
六.事件订阅者
事件订阅者是指那些在类本身中订阅到多个事件的类,从而允许你在单个类中定义一些事件处理器。订阅者应该定义一个subscribe 方法,该方法中传入一个事件分发器实例;简言之就是一个监听器监类依靠不同的方法监听了多个事件类
1.监听器类代码(subscribe中设置了监听)
class TaskToLogListener
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
} public function onAddTask(TaskAdded $event)
{
$task = $event->task;
Log::info('增加了task', ['id' => $task->id, 'name' => $task->name]);
} public function onDelTask(TaskDeled $event)
{
$task = $event->task;
Log::info('删除了task', ['id' => $task->id, 'name' => $task->name]);
} public function subscribe($events)
{
$events->listen('App\Events\TaskAdded','App\Listeners\TaskToLogListener@onAddTask'); $events->listen('App\Events\TaskDeled','App\Listeners\TaskToLogListener@onDelTask');
}
}
2.事件类
TaskAdded.class:
class TaskAdded extends Event
{
use SerializesModels;
public $task; /**
* TaskAdded constructor.
* 构造函数,注入一个Task实例
* @param Task $task
*/
public function __construct(Task $task)
{
$this->task = $task;
} /**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}
TaskDeled.class:
class TaskDeled extends Event
{
use SerializesModels;
public $task; /**
* TaskAdded constructor.
* 构造函数,注入一个Task实例
* @param Task $task
*/
public function __construct(Task $task)
{
$this->task = $task;
} /**
* Get the channels the event should be broadcast on.
*
* @return array
*/
public function broadcastOn()
{
return [];
}
}
3.在EventServiceProvider添加属性$subscribe
protected $subscribe = [TaskToLogListener::class];
4.触发事件
Event::fire(new TaskAdded($task));
Event::fire(new TaskDeled($task));
Laravel之事件的更多相关文章
- Laravel 模型事件入门
Laravel 模型事件允许你监听模型生命周期内的多个关键点,甚至可以在阻止一个模型的保存或者删除. Laravel 模型事件文档 概述了如何使用钩子将对应事件与相关的事件类型关联起来,但是本文的主旨 ...
- Laravel模型事件的实现原理详解
模型事件在 Laravel 的世界中,你对 Eloquent 大多数操作都会或多或少的触发一些模型事件,下面这篇文章主要给大家介绍了关于Laravel模型事件的实现原理,文中通过示例代码介绍的非常详细 ...
- Laravel 5 事件的使用
事件类通常被保存在 app/Events 目录下,而它们的处理程序则被保存在 app/Handlers/Events 目录下. 事件的创建 下面我们用artisan来创建一个事件,比如叫CqhTest ...
- laravel 模型事件 updated 触发条件
1. 只有 $sku->{attribute} != $sku->getOriginal({attribute}) 不一致的时候才会触发 getDirty() 不为空的时候才触发, 而且不 ...
- laravel中事件的监听和订阅
一.前言 更新员工部门主管的时候,需要重新更新一下缓存,这个会比较耗时.所以计划放到队列中来执行.后来想了想,其实用一下事件监听也能实现.人家都说好,然是我也没感觉到有什么好的. 二.正文 1. 在p ...
- laravel队列,事件简单使用方法
A.队列的使用 1.队列配置文件存储在 config/queue.php 根据自己的情况进行配置 2..env文件 QUEUE_DRIVER=database(根据个人情况配置,redis等) 3.创 ...
- 简单易懂的laravel事件,这个功能非常的有用(监听事件,订阅者模式)
先说一下在什么场景会使用这个事件功能. 事情大概是这样的,需求要在用户注册的时候发一些帮助邮件给用户(原本用户在注册之后已经有发别的邮件的了,短信,IM什么的) 原来这个注册的方法也就10多行代码.但 ...
- Laravel 事件系统用法总结(监听事件,观察者模式)
看这篇文章先复习一下设计模式 : https://www.cnblogs.com/fps2tao/p/9640338.html 在理解了观察者模式后,我们开始正文 Laravel 的事件提供了一个简单 ...
- laravel架构
1.Laravel 5.1 中的异常处理器和HTTP异常处理实例教程 http://laravelacademy.org/post/1867.html 2.laravel 集成sentry,sentr ...
随机推荐
- JS省份联级下拉框
<script type="text/javascript"> var china=new Object();china['北京市']=new Array('北京市区' ...
- 洛谷P3112 [USACO14DEC]后卫马克Guard Mark
题目描述 Farmer John and his herd are playing frisbee. Bessie throws the frisbee down the field, but it' ...
- 管理页面的类 PageHelper
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Da ...
- Broadcom GNSS xxx Geolocaltion Sensor与Windows导航程序的兼容性(转)
Broadcom是Windows 8(3G)平板普遍采用的一款GPS传感器, 其windows驱动程序可以提供GNSS接口.GNSS接口提供的数据,说实话确实比普通手机的数据好.在开机.室外.无AGP ...
- lambda calculus
;;;lambda calculus ;;;booleanstrue = \x.\y.xfalse = \x.\y.yif = \v.\t.\f. v t f ;;;exif true M N = M ...
- OpenGL ES课程VI之纹理贴图(原文对照)
http://www.educity.cn/wenda/92368.html OpenGL ES教程VI之纹理贴图(原文对照) OpenGL ES Tutorial for Android – Par ...
- struct timeval和gettimeofday()
http://www.cppblog.com/lynch/archive/2011/08/05/152520.html struct timeval结构体在time.h中的定义为: struct ti ...
- 使用clamav查杀病毒
cd ~ wget http://www.zlib.net/fossils/zlib-1.2.8.tar.gz .tar.gz cd zlib- ./configure --prefix=/usr/l ...
- ZOJ 3820:Building Fire Stations(树的直径 Grade C)
题意: n个点的树,边长全为1,求找出两个点,使得树上离这两个点距离最远的那个点,到这两个点(中某个点就行)的距离最小. 思路: 求树直径,找中点,删除中间那条边(如果直径上点数为奇数,则删任何一侧都 ...
- 【转载】无需图片,使用CSS3实现圆角按钮
原文地址:http://www.open-open.com/home/space-37924-do-blog-id-5789.html 首先来看看效果: 事例HTML代码: <a href=&q ...