一.事件

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

    @author: dlive 0X01 IAT Hook的优缺点 优点:工作原理与实现都比较简单 缺点:如果想钩取的API不在目标进程的IAT中,那么就无法使用该技术进行钩取操作.即如果要钩取的API ...

  2. C语言中的“>>”和“<<”

    http://baike.1688.com/doc/view-d1750791.html C语言中的“>>”和“<<” [标签:程序设计] 浏览次数:68937提问时间:200 ...

  3. 【原创】Linux环境下的图形系统和AMD R600显卡编程(7)——AMD显卡的软件中断

    CPU上处理的中断可以分成“硬件中断”和“软件中断”两类,比如网卡产生的中断称为硬件中断,而如果是软件使用诸如"int 0x10"(X86平台上)这样的指令产生中断称为软件中断,硬 ...

  4. 一个C优先级队列实现

    刚下班没事干,实现了一个简单的优先级队列 #include <stdlib.h>#include <stdio.h> typedef void (*pqueue_setinde ...

  5. V4或者V7包重复冲突,但是不知道删除那个的问题

    加这行代码在dependencies统一级别 configurations { all*.exclude group: 'com.android.support', module: 'support- ...

  6. windwos grpc 编译

    此文档是windwos grpc c++ 编译 ,基于 vs2015 编译完成 获取gRPC源码 gRPC是开源框架,项目代码在github上,所以首先要安装github.github安装后,在指定文 ...

  7. Linux C/C++内存泄漏检测工具:Valgrind

    Valgrind 是一款 Linux下(支持 x86.x86_64和ppc32)程序的内存调试工具,它可以对编译后的二进制程序进行内存使用监测(C语言中的malloc和free,以及C++中的new和 ...

  8. 网站开发只需数小时?Meteor 说这才是未来

    原文: http://www.geekpark.net/topics/211573/ 那个想要挑战过去数十年沿用至今的网站开发模式的新势力来了. Meteor 是从 YC 孵化而出的现代网站开发平台, ...

  9. AsBcd的意思

  10. Java android DES+Base64加密解密

    服务器与客户端加密解密传输, 中间遇到各种坑,客户端无论用AES还是DES解密时都会出现错误,后来才看到好多人说要用AES/DES加完密后还要BASE64加密,照做时发现android和java的Ba ...