事件类通常被保存在 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. Solr5之Schema.xml详解

    schema.xml 是用来定义索引数据中的域的,包括域名称,域类型,域是否索引,是否分词,是否存储,是否标准化即 Norms ,是否存储项向量等等. schema.xml 配置文件的根元素就是 sc ...

  2. 创建一个Windows的NTP Server

    搭建一个VMware vRealize Suite的时候遇见了不少时间同步的问题, 实验室里网络与外界隔绝, 不能使用公网的NTP服务器, 所以使用文中的方法自己搭建了一个. 蛮好用的. Creati ...

  3. android如何播放和录制音频

    视频录制功能正在走来,在Androidsdk中有与之相关的类:android.media.MediaRecorder.当然,因为模拟器上没有提供必要的硬件设施,所以在学习过程中并不能实现.Media能 ...

  4. Python 内置彩蛋

    The Zen of Python, by Tim Peters Beautiful is better than ugly.Explicit is better than implicit.Simp ...

  5. Linux安全事件应急响应排查方法总结

    Linux安全事件应急响应排查方法总结 Linux是服务器操作系统中最常用的操作系统,因为其拥有高性能.高扩展性.高安全性,受到了越来越多的运维人员追捧.但是针对Linux服务器操作系统的安全事件也非 ...

  6. cocos2d-x 3.0rc2中读取sqlite文件

    cocos2d-x 3.0rc2中读取sqlite文件的方式,在Android中直接读取软件内的会失败.须要复制到可写的路径下 sqlite3* dbFile = NULL; std::string ...

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

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

  8. RSA算法 Android JAVA C#互通

    RSA算法属非对称加密算法,在实际使用中,往往客户端使用公钥进行加密传递敏感数据,服务端server使用私钥进行解密,这样防止中间人从网络获取敏感数据的明文. Android端主要代码如下: pack ...

  9. 恶心的hadoop集群

    具体配置:网上一堆,我说一下我的问题好了! “完全” 分布式集群 注意地方有三点: 1.你的"master" dfs目录中的某个Id不一致,具体位置,有空我再找找.(经过我找了一下 ...

  10. IIS服务器下做301永久重定向设置方法

    实现方法如下: 1.新建一个站点,对应目录如E:\wwwroot\301web.该目录下只需要1个文件,即index.html或者加个404.htm.绑定要跳转的域名,如图: 2.在IIS中选中刚才我 ...