事件类通常被保存在 app/Events 目录下,而它们的处理程序则被保存在 app/Handlers/Events 目录下。

事件的创建

  下面我们用artisan来创建一个事件,比如叫CqhTestEvent
php artisan make:event CqhTestEvent
  生成的事件如下
<?php namespace App\Events;
use App\Events\Event;
use Illuminate\Queue\SerializesModels;
class CqhTestEvent extends Event {
use SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct()
{
}
}

事件的触发

  • 方法一:可以直接用event()函数来触发事件,如下
event(new CqhTestEvent());
  • 方法二:也可以用Event facade来触发,如下
$response = Event::fire(new CqhTestEvent());
fire 方法返回一个响应的数组,让你可以用来控制你的应用程序接下来要有什么反应。
 

事件的处理

  事件处理的方法可以分别两种,分别是类和闭包。
  这里我的处理类中叫CqhTestEventHandler,下面我们来用artisan来创建这个处理类
php artisan handler:event CqhTestEventHandler --event=CqhTestEvent
  然后在app/Handlers/Events文件下会生成CqhTestEventHandler.php,结构如下
<?php namespace App\Handlers\Events;
use App\Events\CqhTestEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldBeQueued;
class CqhTestEventHandler {
/**
* Create the event handler.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param CqhTestEvent $event
* @return void
*/
public function handle(CqhTestEvent $event)
{
//
}
}
  然后我们在handle方法里加上一句
	public function handle(CqhTestEvent $event)
{
//
echo 'chenqionghe的事件被处理了';
}
  这样,我们的简单的对应事件的处理就完成了
  然后, 要指定相应事件的处理类也有两种方式,事件服务中指定和Event::listen()方法指定

  方法一:指定要处理的类

  • 在EventServiceProvider的boot方法中指定要处理
  然后,我们需要把这个事件注册到系统服务里边,在app/Providers文件夹里有个EventServiceProvider.php我们,打开他,找到相应的listen属性,加上
  如下
<?php namespace App\Providers;
use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider {
/**
* The event handler mappings for the application.
*
* @var array
*/
protected $listen = [
'event.name' => [
'EventListener',
],
//在这里加上
'App\Events\CqhTestEvent' => [
'App\Handlers\Events\CqhTestEventHandler',
],
];
...
}
  在这里把事件给添加上,并定义相应处理事件的类(注意,这里是可以针对事件使用多个处理类的,只需要在数组里加上就行了)
  • 在Event::listen()方法中指定
Event::listen('App\Events\CqhTestEvent', 'App\Handlers\Events\CqhTestEventHandler');
  注意:指定类的时候和路由是一个原理,事件处理默认会调用CqhTestEventHandler的handle方法,如果要指定相应方法,可以加上@方法名,如CqhTestEventHandler@doEvent
  只需要在调用事件之前指定即可

  方法二:用闭包来处理事件

  我们不可以直接用闭包来处理某个事件,只要在触发事件前定义就可以了,如在EventServiceProvider的boot方法里
Event::listen('App\Events\CqhTestEvent', function($event)
{
// 处理事件...
});
  如果定义了多个这样的事件处理,在触发事件后他们都会一并被执行,就相当于jquery里边的bind方法如,
    public function getTest()
{
Event::listen('App\Events\CqhTestEvent', function($event)
{
echo '触发事件1';
});
Event::listen('App\Events\CqhTestEvent', function($event)
{
echo '触发事件2';
});
Event::listen('App\Events\CqhTestEvent', function($event)
{
echo '触发事件3';
});
event(new CqhTestEvent());
}
  上面注册了CqhTestEvent事件的三个处理,运行结果如下
触发事件1触发事件2触发事件3
  同样,和jquery一样,有时候你会希望停止继续传递事件到其他监听器。你可以通过从处理程序return  false 来做到这件事

    public function getTest()
{
Event::listen('App\Events\CqhTestEvent', function($event)
{
echo '触发事件1';
});
Event::listen('App\Events\CqhTestEvent', function($event)
{
echo '触发事件2';
return false;
});
Event::listen('App\Events\CqhTestEvent', function($event)
{
echo '触发事件3';
});
event(new CqhTestEvent());
}
  运行结果如下
触发事件1触发事件2
 
 

Laravel 5 事件的使用的更多相关文章

  1. Laravel 模型事件入门

    Laravel 模型事件允许你监听模型生命周期内的多个关键点,甚至可以在阻止一个模型的保存或者删除. Laravel 模型事件文档 概述了如何使用钩子将对应事件与相关的事件类型关联起来,但是本文的主旨 ...

  2. Laravel模型事件的实现原理详解

    模型事件在 Laravel 的世界中,你对 Eloquent 大多数操作都会或多或少的触发一些模型事件,下面这篇文章主要给大家介绍了关于Laravel模型事件的实现原理,文中通过示例代码介绍的非常详细 ...

  3. Laravel之事件

    一.事件 事件无处不在,比如用户登录.购买商品.搜索.查看文章,等等,都是事件,有了事件,就有事件监听器,事件监听器监听到事件发生后会执行一些操作,Laravel使用观察者模式来实现这种监听机制.本节 ...

  4. laravel 模型事件 updated 触发条件

    1. 只有 $sku->{attribute} != $sku->getOriginal({attribute}) 不一致的时候才会触发 getDirty() 不为空的时候才触发, 而且不 ...

  5. laravel中事件的监听和订阅

    一.前言 更新员工部门主管的时候,需要重新更新一下缓存,这个会比较耗时.所以计划放到队列中来执行.后来想了想,其实用一下事件监听也能实现.人家都说好,然是我也没感觉到有什么好的. 二.正文 1. 在p ...

  6. laravel队列,事件简单使用方法

    A.队列的使用 1.队列配置文件存储在 config/queue.php 根据自己的情况进行配置 2..env文件 QUEUE_DRIVER=database(根据个人情况配置,redis等) 3.创 ...

  7. 简单易懂的laravel事件,这个功能非常的有用(监听事件,订阅者模式)

    先说一下在什么场景会使用这个事件功能. 事情大概是这样的,需求要在用户注册的时候发一些帮助邮件给用户(原本用户在注册之后已经有发别的邮件的了,短信,IM什么的) 原来这个注册的方法也就10多行代码.但 ...

  8. Laravel 事件系统用法总结(监听事件,观察者模式)

    看这篇文章先复习一下设计模式 : https://www.cnblogs.com/fps2tao/p/9640338.html 在理解了观察者模式后,我们开始正文 Laravel 的事件提供了一个简单 ...

  9. laravel架构

    1.Laravel 5.1 中的异常处理器和HTTP异常处理实例教程 http://laravelacademy.org/post/1867.html 2.laravel 集成sentry,sentr ...

随机推荐

  1. mssql 获取表空间大小

    create table #Data(name varchar(100),row varchar(100),reserved varchar(100),data varchar(100),index_ ...

  2. kindle 贴膜

    我自己贴膜也贴得很好.顺便和大家分享一下我的贴膜经验.需要的道具,一.抹布,二.一张银行卡,三.一卷小筒的透明胶.贴膜关键点,一.环境和贴面必须干净,二.用力要轻,三.顺序是从上往下.具体步骤:1.先 ...

  3. 通过apt-get安装nvidia驱动

    标签:NVIDIA Driver apt 早前安装的NVIDIA显卡驱动在启动X Server的时候提示版本太新了,要求必须使用340.96的,而新的驱动都到了367 https://wiki.deb ...

  4. WPF与winform与silverlight的区别

    收到了一封学生的邮件: =========================== 金老师您好: 最近在学C#.NET,基本语法学习的差不多了,接下来准备学习图形界面设计部分.但是我目前对于.NET的Wi ...

  5. Fiddler高级技巧 - 映射路径到本地文件夹

    适用场景: 你是前端开发人员,要开发一个小模块,需要用到线上的环境(账号.数据.跨域等),但你又没有权限往线上传文件 你是移动测试人员,需要将一组接口的返回结果替换为另一组,最简单的办法就是使用Fid ...

  6. mysql简单性能排查

    mysql> show variables; mysql> show processlist; mysql> show status; mysql> show global s ...

  7. SQL 性能调优日常积累【转】

    阅读目录 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) (2)WHERE子句中的连接顺序 (3)SELECT子句中避免使用 ‘ * ‘ (4)减少访问数据库的次数 (5)在SQL*Plu ...

  8. IT技术团队行而有效的管理之道

    在博客园看到的一份读书笔记,如果日后有机会去管理一个技术团队,那么下面这些经验可能会让你更好地实施工作. IT技术团队员工的特点 高学历,知识密集型,技术立身. 人际关系简单,摩擦大多数由技术产生,相 ...

  9. linux shell脚本备份mysql数据库

    #!/bin/sh # 备份数据库 # Mysql 用户名密码 MYSQL_USER=root MYSQL_PASS=root BACKUP_DIR=/data/backup/mysql DATA_D ...

  10. ios中将事件添加到系统日历

    - (void)saveEvent:(id)sender { //事件市场 EKEventStore *eventStore = [[EKEventStore alloc] init]; //6.0及 ...