一、什么是事件处理

事件就是在特地时间、特定地点、发生的特定行为。例如:删除某个用户帖子这个行为后,要通过站短发送信息给帖子所属的用户。这里就有删除帖子事件,发站短是事件后处理。

二、为什么要使用事件机制(有那些优点)

事件机制是一种很好的应用解耦方式,一个事件可以拥有多个互补依赖的监听器。如用户对某个帖子进行回帖操作后,就可以触发给用户发积分、加金币、清除帖子详情页对varnish缓存、给楼主发送push提醒、同步数据到一uid取模分表对业务上... 。回帖后需要处理对这些业务互补干扰,分属在不同模块,一些服务对业务逻辑还可以进行异步处理,如给楼主发送push提醒。所以事件机制可以解藕,让类承担单一职责,代码变的更清晰、易于维护。

三、该如何使用事件

laravel事件机制主要有注册事件、事件、监听器、事件分发等部分组成。

1、注册事件和监听器

在模块目录下等providers目录下类EventServiceProvider.php的$listen数组包含所有事件(键)和事件所对应监听器(值)来注册事件的监听器,例如我们添加一个添加课程是给用户发送站短

     /**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
LessonJoined::class => [NotifyUserForLessonJoined::class]
];

  2、生成事件和监听器

将事件和监听器放在服务提供者EventServiceProvider.php之后,可以使用命令event:generate在模块下的events、listens目录下生成相对于的事件和监听器

3、定义事件

在模块的events目录中新增事件类

<?php
namespace Education\LiveLesson\Events; use Meijiabang\Events\Event; class LessonJoined extends Event
{
}

4、定义监听者

在模块的listeners目录中新增监听类

<?php

namespace Education\LiveLesson\Listeners;

use Meijiabang\Support\Exception\ExceptionCode;
use Education\LiveLesson\Events\LessonJoined;
use Education\LiveLesson\Services\LessonService;
use Illuminate\Support\Facades\Log;
use Meijiabang\Events\Listener;
use User\Notice\Services\NoticeService; class NotifyUserForLessonJoined extends Listener
{
/**
* @var string
*/
protected $content = '参加《[name]》课程成功,记得按时参加课程>'; /**
* @param LessonJoined $event
* @return bool
*/
public function handle(LessonJoined $event)
{
$model = $event->getModel();
if (!is_null($model)) {
$noticeService = new NoticeService($model->uid, NoticeService::LIVELESSON_JOIN);
$lessonName = app(LessonService::class)->find($model->relation_id)->title; $serviceResult = $noticeService->send([
'lesson_id' => $model->relation_id,
'uid' => $model->uid,
'content' => str_replace('[name]', $lessonName, $this->content),
]);
if (ExceptionCode::SUCCESS != $serviceResult->getCode()) {
Log::info(date("Y-m-d H:i:s") . ' Failed to send live-lesson-join message to ' . $model->uid); return true;
}
} return true;
}
}

5、分发事件

如果要分发事件,你可以将事件实例传递给辅助函数 event。这个函数将会把事件分发到所有已经注册的监听器上。因为辅助函数 event 是全局可访问的,所以你可以在应用中的任何地方调用它:

event(new LessonJoined($privilege));

laravel中的事件处理的更多相关文章

  1. Laravel中的日志与上传

    PHP中的框架众多,我自己就接触了好几个.大学那会啥也不懂啥也不会,拿了一个ThinkPHP学了.也许有好多人吐槽TP,但是个人感觉不能说哪个框架好,哪个框架不好,再不好的框架你能把源码读上一遍,框架 ...

  2. 第38课 Qt中的事件处理(上)

    1. GUI程序原理回顾 (1)图形界面应用程序的消息处理模型 (2)思考:操作系统发送的消息如何转变为Qt信号 2. Qt中的事件处理 (1)Qt平台将系统产生的消息转换为Qt事件 ①Qt事件是一个 ...

  3. laravel中日志为daily时如何设置最大保存天数

    在laravel中,日志设置为daily时,默认保存七天的日志,超过则清除七天前的日志.可修改默认的设置,假如要保存30天的日志,则配置如下: 在配置文件config/app.php中添加如下代码: ...

  4. laravel中的错误与日志

    日志 laravel中的日志是基于monolog而封装的.laravel在它上面做了几个事情: 把monolog中的addInfo等函数简化成为了info这样的函数 增加了useFiles和useDa ...

  5. [转]理解JavaScript中的事件处理

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  6. 理解JavaScript中的事件处理

    什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...

  7. laravel中的$request对象构造及请求生命周期

    laravel应用程序中index.php是所有请求的入口.当用户提交一个form或者访问一个网页时,首先由kernel捕捉到该session PHP运行环境下的用户数据, 生成一个request对象 ...

  8. js中关于事件处理函数名后面是否带括号的问题

    今天总结一个关于事件处理程序的小细节.首先回顾一下事件处理的一些概念. JS中的事件处理(事件绑定)就是让某种或某些事件触发某些活动.有两种常见的形式,分别是DOM Level 0 和DOM Leve ...

  9. cron以及在laravel中使用cron

    yum install vixie-cron yum install crontabs /bin/systemctl restart crond.service #启动服务 /bin/systemct ...

随机推荐

  1. codeforces 1077F1

    题目:https://codeforces.com/contest/1077/problem/F1 题意: 你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x 表示你要从中选出刚好x幅画,并且 ...

  2. rest与restful

      知乎上面摘抄的,感觉不错,分享下:  https://www.zhihu.com/question/28557115 1. REST描述的是在网络中client和server的一种交互形式:RES ...

  3. Java并发(4)- synchronized与CAS

    引言 上一篇文章中我们说过,volatile通过lock指令保证了可见性.有序性以及"部分"原子性.但在大部分并发问题中,都需要保证操作的原子性,volatile并不具有该功能,这 ...

  4. hihoCoder 1527 快速乘法

    #include<bits/stdc++.h> using namespace std; ; char a[N]; int main() { scanf(); ); ,r = n; ') ...

  5. python读写Excel文件_xlrd模块读取,xlwt模块写入

    一.安装xlrd模块和xlwt模块(服务器) 1. 下载xlrd模块和xlwt模块 到python官网http://pypi.python.org/pypi/xlrd下载模块.下载的文件例如:xlrd ...

  6. RPC-Thrift(一)

    一个简单例子 IDL文件如下,详细的IDL语法参考官方文档http://thrift.apache.org/docs/idl. 通过代码生成工具得到两个文件:HelloService.java和Res ...

  7. [BZOJ2190&BZOJ2705]欧拉函数应用两例

    欧拉函数phi[n]是表示1~n中与n互质的数个数. 可以用公式phi[n]=n*(1-1/p1)*(1-1/p2)*(1-1/p3)...*(1-1/pk)来表示.(p为n的质因子) 求phi[p] ...

  8. 【BZOJ】1782: [Usaco2010 Feb]slowdown 慢慢游

    [算法]DFS序+树状数组 [题解]题意相当于统计前i-1个点在第i个点的祖先的个数,显然可以用dfs维护,用树状数组差分维护前缀和. 出栈不新加节点就要注意左闭右开,即in[a[i]]处+1,ou[ ...

  9. 美团网技术团队分享的MySQL索引及慢查询优化教程

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位 ...

  10. php常用的系统函数

    字符串函数 strlen:获取字符串长度,字节长度 substr_count 某字符串出现的次数 substr:字符串截取,获取字符串(按照字节进行截取) mb_strlenmb_substr str ...