简单易懂的laravel事件,这个功能非常的有用(监听事件,订阅者模式)
先说一下在什么场景会使用这个事件功能。
事情大概是这样的,需求要在用户注册的时候发一些帮助邮件给用户(原本用户在注册之后已经有发别的邮件的了,短信,IM什么的)
原来这个注册的方法也就10多行代码。但是有时候我们为了省事,直接在注册代码后面添加了各种代码。
例如这个注册方法本来是这样的
<?php
namespace App\Htt\Controllers; use Illuminate\Http\Request; class UserController extends Controller
{
public function register(Request $request)
{
//获取参数
//验证参数
//写入数据库
//return 注册信息 }
}
现在有一个需求,要求注册之后给用户的邮箱发一个广告,绝大多数的人(也包括以前的我)就直接在这后面接着写代码了
<?php
namespace App\Htt\Controllers; use Illuminate\Http\Request; class UserController extends Controller
{
public function register(Request $request)
{
//获取参数
//验证参数
//写入数据库 //发送广告邮件
//return 注册信息 }
}
这是比较直观的写法,后来又有需求要发个短信。
<?php
namespace App\Htt\Controllers; use Illuminate\Http\Request; class UserController extends Controller
{
public function register(Request $request)
{
//获取参数
//验证参数
//写入数据库 //发送广告邮件
//发送短信
//return 注册信息 }
}
然后又有需求,要发IM消息,这样的需求很多。这些方法如果你封装了,可能也就一行代码。
但是,在实际项目中,这个注册方法里面已经加了很多东西。如果多人开发的话各种不方便。然后想到了laravel似乎有这个功能,但是一直都不知道怎么应用,仔细看了一下手册,发现和自己的想法不谋而合。
laravel的事件功能实际上更倾向是一种管理手段,并不是没了它我们就做不到了,只是它能让我们做得更加好,更加优雅。
laravel的事件是一种管理+实现的体现,它首先有一个总的目录,然后我们可以宏观的看到所有的事件,而不需要每次都要打开控制器的方法我们才能知道注册后会发生什么,这一点很重要,非常的方便,我就不按着laravel的顺序来讲,而是按着实际情况来建立这种关系。
现在我们无非就是要在注册之后要做一系列的事情,首先得注册完之后调用一个事件,然后这个事件再做各种各样的事
<?php
namespace App\Htt\Controllers; use Illuminate\Http\Request;
//我们先引入一个事件类,名字自定义的,之后再一步一步创建
use App\Events\Register; class UserController extends Controller
{
public function register(Request $request)
{
//获取参数
//验证参数
//写入数据库
//触发事件,以后所有需要注册后要做的事情,都不需要再这里加代码了,我们只需要管理事件就好了
//event方法是laravel自带方法, $uid是外部参数,看你需要做什么,传什么参数了。注册之后肯定有$uid的嘛
event(new Register($uid));
//return 注册信息 }
}
找到\app\Providers\EventServiceProvider.php文件。给它添加关系,告诉系统,有人用event()调用了事件之后要被谁监听得到。
<?php namespace App\Providers; use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider; class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
// 用户注册后的事件
'App\Events\Register' => [
// 发送广告邮件
'App\Listeners\SendAdMail',
// 发送短信
'App\Listeners\SendSms',
// 发送帮助信息
'App\Listeners\SendHelpInformation', ],
];
}
这里是注册事件的入口,相当于一个总目录,这样就可以跟注册代码解耦了,以后要加东西我们就不需要再去看注册方法的代码了
现在注册完之后会触发这个App\Events\Register类,然后这个类会被App\Listeners\SendAdMail,App\Listeners\SendSms,App\Listeners\SendHelpInformation监听得到,我们进入app\Events目录,创建Register这个类
<?php namespace App\Events; class Register
{ public $uid; /**
* 创建一个新的事件实例.
*
* @param Order $order
* @return void
*/
public function __construct($uid)
{
$this->uid = $uid;
}
}
这样就可以了。
然后去app\Listeners目录创建各种要做的事件监听类。
<?php namespace App\Listeners; use App\Events\Register;
use App\Models\User;
use Illuminate\Contracts\Queue\ShouldQueue; class SendHelpInformation implements ShouldQueue
{ public function __construct()
{
//
} public function handle(Register $event)
{
$uid = $event->uid; $user = User::find($uid); //......各种实现
}
}
这个handle方法就是我们要做的具体实现了,有个很方便的功能就是如果implements ShouldQueue这个接口的话就会异步队列执行,如果去掉的话就是同步执行。很方便有没有,这样代码就解耦了,不需要再管注册代码了,在这里就能很方便的管理了。多人开发也是单独写自己的Listeners就可以了。
转: https://segmentfault.com/a/1190000010730545
设计模式的阅读: https://www.cnblogs.com/fps2tao/p/9640338.html
关联阅读: https://www.cnblogs.com/fps2tao/p/9681317.html
简单易懂的laravel事件,这个功能非常的有用(监听事件,订阅者模式)的更多相关文章
- javascript事件有哪些?javascript的监听事件
事件类型: 1.界面事件 onload:描述文档,图片,css已经frame,object加载完毕时触发,window.onload window.onload = function(){ //代表图 ...
- java在线聊天项目0.3版本 制作客户端窗体,实现发送按钮和回车发送信息功能,使用ActionListener监听事件中actionPerformed方法(用内部类和匿名内部类两种方法)
方法一,使用匿名内部类的监听方法,因方法一致代码稍冗余 package com.swift; import java.awt.BorderLayout; import java.awt.Color; ...
- 为不具有change事件的html标签设置监听事件
change事件会在文本内容或选项被更改时触发. 该事件仅适用于<input type="text">和<textarea>以及<select> ...
- EventTrigger动态添加监听事件
在 Unity3D 中,通过拖拽的方式在 EventTrigger 组件中添加监听事件就不多说了,很简单.这里主要说的是通过代码动态往 EventTrigger 组件中添加监听事件,有个很坑的地方,就 ...
- 关于AngularJs中监听事件及脏循环的理解
可能很多刚入行或者刚学习的前端对于AngularJs中的一些事件或者概念感觉不理解或者没有思路,今天让我们一起来剖析一下AngularJs中的一些事件. AngularJs中对于的监听事件会用到一个s ...
- IE浏览器的脚本文本框监听事件
一.IE8的文本框监听事件 由于在IE8所以input和propertychange都不能用,终于皇天不负有心人让我找到了这个:https://github.com/sophiebits/jquery ...
- laravel中事件的监听和订阅
一.前言 更新员工部门主管的时候,需要重新更新一下缓存,这个会比较耗时.所以计划放到队列中来执行.后来想了想,其实用一下事件监听也能实现.人家都说好,然是我也没感觉到有什么好的. 二.正文 1. 在p ...
- android listview 的监听事件
今天遇到了一个比较让我头疼的问题,不过追根揭底只是我对listview理解的不够透彻罢了, 闲言少叙,说说我遇到的问题吧: 上篇随笔我写了关于listview的使用,如果你也已经写好了列表那么恭喜这一 ...
- miniui 给表格行添加监听事件的几种方法以及点击某列列名数据不能排序的问题
最近在使用miniui框架做开发,在做表格行的点击监听事件中发现了几个属性,都可以起到监听效果但是执行的结果却大有不同.好了废话不多说,直接上代码. <div id="pageGrid ...
随机推荐
- 如何使用千千静听为MP3添加专辑封面和文字信息
使用千千静听播放器打开某MP3文件,右击该文件,选择属性. 2 点击专辑封面即可添加或更换专辑封面 点击保存到文件再点击重新读取文件即可发现有效了 3 为MP3批量添加添加封面 选中播放列表的所有文件 ...
- Java从零开始学二(标识符和关键字)
标识符.关键字.注释 一.标识符 Java中的包.类.方法.参数和变量的名字由任意顺序的大小字母.数字.下划线(_).和美元符号($)组成, 标识符:不能以数字开头.也不能是JAVA中的保留关键字 如 ...
- 使用ADS1.2的注意事项及常用技巧
如果创建的项目中有多个文件时(尤其是编译后的镜像大小超过4K时),一定要在link order栏下调整文件顺序,主要是前几个文件的顺序(2440init.s.2440slib.s.nand.c这三个文 ...
- PyQt5教程——事件和信号(5)
PyQt5中的事件和信号 在这部分PyQt5编程教程中,我们探索应用中事件和信号的发生. 事件 所有的GUI应用都是事件驱动的.事件主要由应用的用户操作产生的.但是事件可能由其他条件触发,比如:一个网 ...
- bzoj3675【APIO2014】序列切割
3675: [Apio2014]序列切割 Time Limit: 40 Sec Memory Limit: 128 MB Submit: 1468 Solved: 607 [Submit][Sta ...
- 用 Eclipse 插件提高代码质量
如果能在构建代码前发现代码中潜在的问题会怎么样呢?很有趣的是,Eclipse 插件中就有这样的工具,比如 JDepend 和 CheckStyle,它们能帮您在软件问题暴露前发现这些问题.在 让开发自 ...
- 改动Apach默认port
一.改动Apache的默认port号 在WEB SERVER界,无论是微软的IIS还是世界排名第一的Apache,它们安装好后默认的网页服务port号都是80.有必要指出的是,假设你的电脑中已经安装有 ...
- JavaWeb 路径问题
路径问题 CreateTime--2016年9月22日15:19:56 Author:Marydon 一.jsp页面 src="../demo/clazz/clazz_add.js&qu ...
- x-code的使用技巧心得
xcode是苹果开发的一款图形化,而且用户交互很好的开发软件开发工具. 它支持 C语言 o-bjiect语言 c++ 等多种语言的开发.功能强大,俗话说的好,工欲善其事,必先利其器,以下将描写叙述一下 ...
- Windows下如何配置tomcat环境变量
Apache Tomcat 是一款 Java Servlet 和 JavaServer Pages 技术的开源软件实现,可以作为测试 Servlet 的独立服务器,而且可以集成到 Apache Web ...