一.事件

事件无处不在,比如用户登录、购买商品、搜索、查看文章,等等,都是事件,有了事件,就有事件监听器,事件监听器监听到事件发生后会执行一些操作,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之事件的更多相关文章

  1. Laravel 模型事件入门

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

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

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

  3. Laravel 5 事件的使用

    事件类通常被保存在 app/Events 目录下,而它们的处理程序则被保存在 app/Handlers/Events 目录下. 事件的创建 下面我们用artisan来创建一个事件,比如叫CqhTest ...

  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. [ CodeVS冲杯之路 ] P1295

    不充钱,你怎么AC? 题目:http://codevs.cn/problem/1295/ 数据很小,直接DFS,加上剪枝 剪枝其实就是判重,首先深度是行下标,这里自带不重复,枚举的列下标,用 f 记录 ...

  2. 在C中就是字符'\r';换行是<lf>,是字符'\n'。

    在C中就是字符'\r':换行是<lf>,是字符'\n'.

  3. Flask学习总结笔记推荐

    https://blog.csdn.net/kikaylee/article/category/6551426

  4. Windows消息类型

    WM_ Window Message 窗口消息,一般用在SendMessage,PostMessage这样的消息函数中 SM_ Static Message 静态标签消息 SS_ Static Sty ...

  5. AC日记——最小正子段和 51nod 1065

    最小正子段和 思路: 找最小的大于0的sum[j]-sum[i](j>i): 高级数据结构(splay)水过: 来,上代码: #include <cstdio> #include & ...

  6. Flask的上下文管理机制

    前引 在了解flask上下文管理机制之前,先来一波必知必会的知识点. 面向对象双下方法 首先,先来聊一聊面向对象中的一些特殊的双下划线方法,比如__call__.__getattr__系列.__get ...

  7. Codeforces 897 B.Chtholly's request-思维题(处理前一半)

      B. Chtholly's request   time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  8. Codeforces Gym100952 D. Time to go back-杨辉三角处理组合数 (2015 HIAST Collegiate Programming Contest)

    D. Time to go back   time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. 51 nod 1419 最小公倍数挑战【数论/互质+思维】

    1419 最小公倍数挑战 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 几天以前,我学习了最小公倍数.玩得挺久了 ...

  10. android如何取消闹铃

    取消闹钟: Intent intent = new Intent(context, TestReceiver.class); PendingIntent pi = PendingIntent.getB ...