有时候当我们单纯的看 Laravel手册的时候会有一些疑惑,比如说系统服务下的授权和事件,这些功能服务的应用场景是什么,其实如果没有经历过一定的开发经验有这些疑惑是很正常的事情,但是当我们在工作中多加思考会发现有时候这些服务其实我们一直都见过。下面就事件、事件监听举一个很简单的例子你就会发现。

这个例子是关于文章的浏览数的实现,当用户查看文章的时候文章的浏览数会增加1,用户查看文章就是一个事件,有了事件,就需要一个事件监听器,对监听的事件发生后执行相应的操作(文章浏览数加1),其实这种监听机制在 Laravel 中是通过观察者模式实现的.
链接

laravel 事件监听使用大概分为以下步骤:

  • ① 注册事件和事件监听器
  • ② 生成事件文件和事件监听器文件
  • ③ 定义事件
  • ④ 定义事件监听器
  • ⑤ 分发事件 (调用事件)

1. 注册事件和事件监听器

在我们使用事件之前,首先应该先去 app/Providers/ 目录下打开 EventServiceProvider.php 文件之后我们会看到如下的一个数组

  1. protected $listen = [
  2. 'App\Events\Event' => [
  3. 'App\Listeners\EventListener',
  4. ],
  5. 'App\Events\ArticleEvent' => [
  6. 'App\Listeners\ArticleEventListener',
  7. ],
  8. 'App\Events\AdminLoginEvent' => [
  9. 'App\Listeners\AdminLoginEventListener',
  10. ],
  11. 'Illuminate\Database\Events\QueryExecuted' => [
  12. 'App\Listeners\QueryListener'
  13. ],
  14. ];

数组 $listen 是用来注册我们的事件和事件监听器的一个数组,其中数组的键为我们需要定义的事件,值对应的为我们需要定义的事件监听器,
比如我这里,需要注册的
事件为:ArticleEvent 指定路径为 App\Events\ArticleEvent (处理文章点击的一个事件)
事件监听器为:ArticleEventListener 指定路径为 App\Listeners\ArticleEventListener (监听文章点击事件的监听器)
我们需要把指定路径对应上图,增加到数组中,
此时我们已经注册好了事件和监听器

2. 生成事件文件和事件监听器文件

事件文件存放在 app/Events 目录下 监听器 存放在 app/Listeners 目录下 此时我们虽然定义好了监听器,但是对应文件并不存在,我们需要使用 laravel 的 artisan 命令 来在指定目录下生成 事件文件 ArticleEvent 和 事件监听 ArticleEventListener 文件

php artisan event:generate

文件生成之后,下面开始定义事件

3. 定义事件

打开 app/Events 目录下的 ArticleEvent .php 事件文件,如下有个结构函数

  1. class ArticleEvent
  2. {
  3. use Dispatchable, InteractsWithSockets, SerializesModels;
  4. public $article;
  5. /**
  6. * Create a new event instance.
  7. *
  8. * @return void
  9. */
  10. public function __construct(Article $article)
  11. {
  12. //
  13. $this->article = $article;
  14. }
  15. /**
  16. * Get the channels the event should broadcast on.
  17. *
  18. * @return \Illuminate\Broadcasting\Channel|array
  19. */
  20. public function broadcastOn()
  21. {
  22. return new PrivateChannel('channel-name');
  23. }
  24. }

当我们在调用事件的时候我们有时候需要,给事件传递参数,这个参数可能是个 ORM 模型 也可能是个数据集 或者是个字符串,此时如果我们希望事件能够接收到我们传递的参数,就需要在 construct () 结构函数中来 定义接收,有两种方法:
第一种
我们使用依赖注入的方式定义接收的参数 (文档中便是此方法), 假如我们接收的参数为 Eloquent ORM 对象 Article 则我们需要在事件中 引入 Article模型,然后在 construct () 指定依赖,在定义完接收对象之后,还需要定义一个 pubic 属性 然后将接收的参数赋值给这个 public 属性,以便于 事件监听 程序调用 我们这里定义为 public $article 如下:

  1. namespace App\Events;
  2. use App\Http\Models\Article;
  1. public function __construct(Article $article)
  2. {
  3. //
  4. $this->article = $article;
  5. }

第二种
使用普通的参数接收方式,直接在 construct () 函数中指定一个参数用来接收调用事件传递的参数,这种就和我们正常函数传参相同,同样我们需要定义一个 公有属性,将参数赋值给这个公有属性,这里仍然使用 public $article,如下

  1. public function __construct($article)
  2. {
  3. //
  4. $this->article = $article;
  5. }

以上我们,可以通过两种方式来定义事件的接收

4. 定义事件监听器

打开 app/Listeners 目录下的 ArticleEventListener.php 事件文件,在事件监听文件中有个 handle 函数用来处理我们的业务逻辑
如下:

  1. public function handle(ArticleEvent $event)
  2. {
  3. //
  4. $id = $event->article->id;
  5. Article::where('id',$id)->increment('hits');
  6. }

5. 分发事件 (调用事件)

上面我们都定义好之后在我们业务需要的地方执行分发事件 (调用事件) 使用 event (new 事件名 (参数)) 来执行事件分发 (事件调用)
注意: 如果我们定义事件的时候使用的是依赖注入的方式来传递参数,那么我们在分发事件的时候 只能传递我们指定的依赖,否则会报错,例如我们上面使用的 Article $article 依赖 则在调用事件的时候 我们只能在我们的控制器中 传递 模型 Article的 ORM 模型如下:

  1. use App\Events\ArticleEvent;
  2. use App\Http\Models\Article;
  1. public function article_detail(Request $request)
  2. {
  3. $article_id = Input::get('article_id');
  4. $info = Article::where(['id'=>$article_id])->first();
  5. event(new ArticleEvent($info));
  6. return view('home.article.article_detail')->with([
  7. 'info'=>$info
  8. ]);
  9. }

当我们查看文章时,文章点击数就会自动加1

当我们使用第二种方法来定义事件的接收时,我们在调用事件时,传递的参数就会没有限制了 我们可以根据需要传递不同的参数到事件中去,然后在事件监听中 根据业务需求来获取参数处理业务逻辑

以上便是两种定义方式的,两种事件调用方式


http://www.taodudu.cc/news/show-660254.html

相关文章:

  • MarkDown学习之Typora的使用
  • YAML入门教程
  • 谷歌浏览器截图
  • canvas实现在线签名
  • 宝塔使用webhook自动部署php项目
  • php中soap的使用以及wsdl的生成
  • Dingo Api 入门
  • 注册树模式
  • 生成自签名ssl证书
  • phpstrom 操作技巧
  • laravel 框架基础 学习整理
  • Redis学习整理
  • 高性能 Redis 实战
  • php中...的用法
  • 高性能mysql整理
  • 配置lamp+supervisor
  • PHP简单实现LRU算法原理
  • php的buffer缓存区
  • Android 消息机制 Handler总结
  • 自定义View 中很关键的问题View获取宽/高是0 的解决办法
  • Android 中的线程及 AsyncTask(线程形态之一)解析一下
  • 使用 okHttp 3.0 版本前后的两点区别.(不要入坑哦)
  • RecyclerView的版本要和appcompat 的版本不一致 引发的错误
  • Android 原生通知Notification 写法
  • Android百度地图显示空白(只有格子)的具体真实解决方法
  • 百度地图SDK v3.6.0以上版本找不到PoiOverlay类的解决方法
  • 百度地图SDK v3.6.0以上版本setOnMarkerClickListener 失效的问题解决
  • 观察者模式——解耦利器
  • Android 性能优化——绘制优化
  • Android 性能优化——布局优化

Laravel event 事件的简单使用相关推荐

  1. java event事件_简单的Java Event-事件框架

    自己写的一个简单的Java事件框架.目前具备以下功能: 1.通过继承Event类,用户可自定义事件. 2.通过EventService 的fireEvent(Event e) 发出一个事件. 3.通过 ...

  2. KSO-c#中 event事件的简单使用

    定义 事件是一种特殊的多播委托,仅可以从声明事件的类或结构(发布服务器类)中对其进行调用. 如果其他类或结构订阅该事件,则在发布服务器类引发该事件时,将调用其事件处理程序方法. 有关详细信息和代码示例 ...

  3. python 线程安全的数据类型_详解python多线程、锁、event事件机制的简单使用

    详解python多线程.锁.event事件机制的简单使用 发布时间:2020-09-25 02:04:12 来源:脚本之家 阅读:117 作者:君惜 线程和进程 1.线程共享创建它的进程的地址空间,进 ...

  4. 第53天:鼠标事件、event事件对象

    -->鼠标事件 -->event事件对象 -->默认事件 -->键盘事件(keyCode) -->拖拽效果 一.鼠标事件 onclick ---------------鼠 ...

  5. input回车触发事件_JavaScript学习笔记(十五)-- Event事件(上)

    EVENT(上) 之前我们简单的了解过一些事件,比如 onclick / onload / onscroll / ... 今天开始,我们详细的学习一些 事件 什么是事件 一个事件由什么东西组成 触发谁 ...

  6. Qt键盘事件(二)——长按按键反复触发event事件问题解决

    1.问题描述 在Jungle的上一篇文章中(Qt键盘事件(一)--检测按键输入及解决无法响应方向键问题),Jungle简单实现了利用qt检测用户按键操作并将键按下\释放操作打印在Qt界面上的一个小程序 ...

  7. Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事件的简单整理

    Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事件的简单整理 目录 Vue 之 vue-seamless-scroll 实现简单自动无缝滚动,且添加对应点击事 ...

  8. mysql启动时自动启动event事件

    mysql定时执行-mysql event事件 2012年12月07日  ⁄ mysql基础语法  ⁄ 共 3221字 ⁄ 被围观 167 views+⁄ 发帖人:  admin 分别有liunx,j ...

  9. Pygame Event事件模块(示例)

    Pygame Event事件模块(示例) 原文链接 参考文章 事件(Event)是 Pygame 的重要模块之一,它是构建整个游戏程序的核心,比如鼠标点击.键盘敲击.游戏窗口移动.调整窗口大小.触发特 ...

最新文章

  1. Javascript鼠标滚轮事件兼容写法
  2. zabbix1.8和2.0版本通用的安装脚本
  3. linux docker中gdb调试断点不停
  4. django博客项目8:文章详情页
  5. ffmpeg 怎么处理udp音频_STREAM: srs 2.0release,ffmpeg实时转码udp流,出现只有音频没有视频的问题?...
  6. Java中的JDBC是什么?
  7. 从HashiCorp Nomad对上百万容器进行调度所学到的经验
  8. 屏幕录像 Camstudio
  9. 如何在Java 8中创建线程安全的ConcurrentHashSet?
  10. 线性动态电路的复频域分析
  11. python manage.py startapp app 时候报错No module named _sqlite3
  12. 【PostgreSQL-9.6.3】设置非自动提交
  13. 量子力学概论_科学网—《量子力学导论》潘必才 - 中国科大出版社的博文
  14. 在局域网被网络管理员限制了远程连接的默认端口3389,导致无法远程桌面连接
  15. 微软加入JCP参与Java未来版本开发
  16. win7如何设置通电自动开机_电脑如何设置自动开机,教您如何设置
  17. 中国移动通信互联网短信网关接口协议CMPP2.0(普通文本短信、二进制数据短信)
  18. 总结:大学实验室的教授喜欢什么样的本科实习学生
  19. 用FPGA实现半加器
  20. 国产旗舰手机定价近六千,却连iPhone12都打不过,用户选谁很明确

热门文章

  1. mysql pl安装教程_ubuntu 16 mysql安装包安装 (推荐在线安装)
  2. java 头尾 队列_探索JAVA并发 - 并发容器全家福
  3. 六十七、二分查找算法及其四个变形问题
  4. 一、Git 多人协作模拟实战
  5. 微信小程序开发的快速步骤方法和最大的坑
  6. Vue-第七天 学习与相关问题总结
  7. 用状态空间法(卡尔曼滤波)解决深度高斯过程问题
  8. 多模态中的Prompt范式:从CLIP、CoOp到CLIP-adapter
  9. NeurIPS 2020 | 利用像素级别循环一致性解决领域自适应语义分割问题
  10. 如何获取高精度CV模型?快来试试百度EasyDL超大规模视觉预训练模型