当前位置: 首页 > news >正文

简单易懂的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\SendSmsApp\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

 

相关文章:

  • express中间件系统的基本实现
  • iOS开发 适配iPhoneX/iPhoneXr/iPhoneXs/iPhonexs max
  • 互融云采购招标供应链系统:为供应链行业创造良好环境
  • 第一次作业
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • 大数据
  • TitleBar 的那些设置
  • FR 在数据库查询中使用模板参数
  • 07-文本属性和字体属性,超链接导航栏案例,background,
  • python数据结构转换格式化
  • 服务器连接不成功测试办法
  • 英语发音规则---N字母
  • python深坑集锦 -- super
  • 反客为主 ,Linux 成为微软 Azure 上最流行的操作系统
  • Linux下面如何运行.sh文件
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular Elements 及其运作原理
  • C++11: atomic 头文件
  • CentOS7 安装JDK
  • css布局,左右固定中间自适应实现
  • HomeBrew常规使用教程
  • Java 多线程编程之:notify 和 wait 用法
  • java 多线程基础, 我觉得还是有必要看看的
  • js面向对象
  • Linux链接文件
  • miaov-React 最佳入门
  • TCP拥塞控制
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • zookeeper系列(七)实战分布式命名服务
  • 欢迎参加第二届中国游戏开发者大会
  • 使用parted解决大于2T的磁盘分区
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 微信公众号开发小记——5.python微信红包
  • 想写好前端,先练好内功
  • 用Canvas画一棵二叉树
  • kubernetes资源对象--ingress
  • 阿里云API、SDK和CLI应用实践方案
  • ​linux启动进程的方式
  • ​比特币大跌的 2 个原因
  • !!Dom4j 学习笔记
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (办公)springboot配置aop处理请求.
  • (蓝桥杯每日一题)love
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)linux 命令大全
  • (转)负载均衡,回话保持,cookie
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .NET 8.0 发布到 IIS
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET构架之我见