当前位置: 首页 > 编程笔记 >

分享个简单易懂且非常有用的laravel事件

谭敏学
2023-03-14
本文向大家介绍分享个简单易懂且非常有用的laravel事件,包括了分享个简单易懂且非常有用的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就可以了。

具体的建议大家去看看手册吧,有些内容我这里就不完全说了。我只是抛砖引玉

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对小牛知识库的支持。

 类似资料:
  • 本文向大家介绍简单易懂的天气插件(代码分享),包括了简单易懂的天气插件(代码分享)的使用技巧和注意事项,需要的朋友参考一下 效果图如下: 代码如下所示: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 问题内容: 用外行的话来说,Java中的“可运行”是什么?我是一名高中的AP编程学生,其任务是进行研究或从他人那里寻找“可运行的”是什么(我们只是进入OOP,并且还没有接触过线程)。 问题答案: 从本质上讲,Runnable是一类类(Runnable是一个接口),可以将其放入线程中,以描述该线程应该做什么。 该Runnable接口要求的类的实现方法如下所示: 然后像这样使用它: 如果您没有该接口,

  • 本文向大家介绍分享一个简单的sql注入,包括了分享一个简单的sql注入的使用技巧和注意事项,需要的朋友参考一下 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站

  • 本文向大家介绍JavaScript 2048 游戏实例代码(简单易懂),包括了JavaScript 2048 游戏实例代码(简单易懂)的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码了,觉得很满意直接拿去。 以上代码还很满意吧,都是些div+css方面的知识,代码有问题欢迎各位亲提出宝贵意见,共同学习进步,同时也非常感谢大家对呐喊教程网站的支持,谢谢!

  • ationConfigEmbeddedWebApplicationContext:上下文初始化过程中遇到异常-取消刷新尝试:org.springframework.beans.factory.unsatisfieddependencyException:创建名为“org.springframework.boot.autocigure.orm.jpa.HibernateJpaAutoConfigur

  • 问题内容: 我试图找到一个非常简单,流畅,轻巧的javascript或jquery字幕。我已经尝试过丝绸选框之类的东西,但不适用于我正在使用的应用程序。因此,越短越好,越好-并且越容易调试。有人知道字幕易于实现的JavaScript替换吗? 码 问题答案: 希望这对您有所帮助,加油! html jQuery代码