目录

  • 1 注册事件和监听器
  • 2 定义事件
  • 3 定义监听器
  • 4 分发事件
  • 更多使用方法
    • 1. 可以手动注册事件
    • 2. 事件监听器中调用队列
    • 3.事件订阅者

1 注册事件和监听器

1、修改EventServiceProvider中的listen数组

/*** 应用程序的事件监听器映射。** @var array*/
protected $listen = ['App\Events\OrderShipped' => ['App\Listeners\SendShipmentNotification',],
];

2、创建相应文件

php artisan event:generate

运行上面命令后,根据上面修改的listen数组,会在app目录下会生成相应的文件夹和文件

2 定义事件

修改App\Events\OrderShipped.php文件

<?phpnamespace App\Events;use App\Order;
use Illuminate\Queue\SerializesModels;class OrderShipped
{use SerializesModels;public $order;/*** 创建一个事件实例。** @param  Order  $order* @return void*/public function __construct(Order $order){$this->order = $order;}
}

3 定义监听器

<?phpnamespace App\Listeners;use App\Events\OrderShipped;class SendShipmentNotification
{/*** 创建事件监听器。** @return void*/public function __construct(){//你的事件监听器也可以在构造函数中加入任何依赖关系的类型提示。//所有的事件监听器都是通过 Laravel 的 服务容器 来解析的,因此所有的依赖都将会被自动注入。}/*** 处理事件** @param  OrderShipped  $event* @return void*/public function handle(OrderShipped $event){/*********************************************    * 1.当你分发事件之后,这里你可以实现你想做的事情 ...* 2.如果一个事件有多个监听器,这里返回false则不会再被其他的监听器获取*///用 $event->order 来访问 order ...dd($event);//return false;}
}

4 分发事件

可以使用全局辅助函数event(),可以在应用的任何地方使用,将事件分发给已经注册的监听器上。

<?phpnamespace App\Http\Controllers;use App\Order;
use App\Events\OrderShipped;
use App\Http\Controllers\Controller;class OrderController extends Controller
{public function ship($orderId){$order = Order::findOrFail($orderId);//分发事件,最后dd()打印出$orderevent(new OrderShipped($order));}
}

更多使用方法

1. 可以手动注册事件

事件通常是像上面那样在$listen数组中定义, 但是,也可以在 EventServiceProvider 类的 boot 方法中注册基于事件的闭包

/*** 注册应用程序中的任何其他事件。** @return void*/
public function boot()
{parent::boot();Event::listen('event.name', function ($foo, $bar) {//});//这里还可以使用通配符*,在此监听多个事件。//通配符监听器接受事件名称作为其第一个参数,并将整个事件数据数组作为其第二个参数:Event::listen('event.*', function ($eventName, array $data) {//
});
}

2. 事件监听器中调用队列

1、如果需要使用比较发邮件等比较慢的任务,则可以丢给队列处理

只需要将让监听类实现ShouldQueue接口

<?phpnamespace App\Listeners;use App\Events\OrderShipped;
use Illuminate\Contracts\Queue\ShouldQueue;class SendShipmentNotification implements ShouldQueue
{//
}

2、可以自定义队列连接和名称

监听器类中定义 $connection 和 $queue 属性即可

<?phpnamespace App\Listeners;use App\Events\OrderShipped;
use Illuminate\Contracts\Queue\ShouldQueue;class SendShipmentNotification implements ShouldQueue
{/*** 任务应该发送到的队列的连接的名称** @var string|null*/public $connection = 'sqs';/*** 任务应该发送到的队列的名称** @var string|null*/public $queue = 'listeners';
}

3、手动访问队列

如果你需要手动访问监听器下面队列任务的 delete 和 release 方法,你可以添加 Illuminate\Queue\InteractsWithQueue trait 来实现。这个 trait 会默认加载到生成的监听器中,并提供对这些方法的访问:

<?phpnamespace App\Listeners;use App\Events\OrderShipped;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;class SendShipmentNotification implements ShouldQueue
{use InteractsWithQueue;/*** Handle the event.** @param  \App\Events\OrderShipped  $event* @return void*/public function handle(OrderShipped $event){if (true) {$this->release(30);}
}

4、处理失败队列

事件监听器的队列任务可能会失败,而如果监听器的队列任务超过了队列中定义的最大尝试次数,则会监听器上调用 failed 方法。failed 方法接受接收事件实例和导致失败的异常作为参数:

<?phpnamespace App\Listeners;use App\Events\OrderShipped;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;class SendShipmentNotification implements ShouldQueue
{use InteractsWithQueue;/*** 处理事件** @param  \App\Events\OrderShipped  $event* @return void*/public function handle(OrderShipped $event){//}/*** 处理任务失败** @param  \App\Events\OrderShipped  $event* @param  \Exception  $exception* @return void*/public function failed(OrderShipped $event, $exception){//}
}

3.事件订阅者

1、编写事件订阅者类

事件订阅者是一个可以在自身内部订阅多个事件的类,即能够在单个类中定义多个事件处理器。订阅者应该定义一个 subscribe 方法,这个方法接受一个事件分发器的实例。你可以调用给定的事件分发器上的 listen 方法来注册事件监听器:

<?phpnamespace App\Listeners;class UserEventSubscriber
{/*** 处理用户登录事件。*/public function onUserLogin($event) {}/*** 处理用户注销事件。*/public function onUserLogout($event) {}/*** 为订阅者注册监听器。** @param  Illuminate\Events\Dispatcher  $events*/public function subscribe($events){$events->listen('Illuminate\Auth\Events\Login','App\Listeners\UserEventSubscriber@onUserLogin');$events->listen('Illuminate\Auth\Events\Logout','App\Listeners\UserEventSubscriber@onUserLogout');}}

2、注册事件订阅者

在 EventServiceProvider 类的 $subscribe 属性中注册订阅者

<?phpnamespace App\Providers;use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;class EventServiceProvider extends ServiceProvider
{/*** 应用中事件监听器的映射。** @var array*/protected $listen = [//];/*** 需要注册的订阅者类。** @var array*/protected $subscribe = ['App\Listeners\UserEventSubscriber',];
}

转载于:https://www.cnblogs.com/redirect/p/8435882.html

laravel5.5事件系统相关推荐

  1. Laravel5.5之事件监听、任务调度、队列

    一.事件监听 流程: 1.1 创建event php artisan make:event UserLogin LoginController.php /*** The user has been a ...

  2. php set medias,laravel5.1 -- Integrate FileManager and CKeditor into laravel

    FileManager中文名叫文件管理器,也叫文件浏览器,它给我们提供了一个可视化的界面来管理文件和文件夹.利用FileManager,我们可以对文件进行浏览.增加.打印.修改(文件属性).重命名.搜 ...

  3. laravel5.4 关于数据填充的知识

    需求:大量excel表格数据 集中整理到一个规定数据表中,并且增加新字段做标记 步骤:把需要整理的excel表格提前存放到mysql数据库指定的表中 ,可以用图形化工具来执行! 核心:利用larave ...

  4. React事件系统整理

    事件系统 Virtual DOM在内存中是以对象的形式存在,如果想要在这些对象上加事件就会比较简单.React基于Virtual DOM实现了一个合成事件层,我们所定义的事件会接受到一个合成事件对象的 ...

  5. Laravel5.5的异常捕获和处理

    一般在web开发中,我们很少会接触到除了404页面其它的http通信错误页面,即使是做404页面,我们也只是单纯的修改框架自带了404模板,很少能够做到完全的控制.但Laravel5改变了这种现状,那 ...

  6. python 事件通知模式_请问在 Python 的事件系统中,如何可以通过事件通知立刻终结一个正在运行的子线程?...

    大家好,最近在完善手头上一个基于事件系统的 GUI . 现在遇到一个问题,就是当我在执行一个按钮点击事件的时候,实际会开一个子线程进行业务逻辑的处理,这个处理过程可能会比较长,并且中间可能会出现一些不 ...

  7. 小白巷分享 -- Laravel5的新特性之异常处理

    小白巷分享 -- Laravel5的新特性之异常处理 参考文章: (1)小白巷分享 -- Laravel5的新特性之异常处理 (2)https://www.cnblogs.com/jroy/p/443 ...

  8. laravel5.2基础多模块开发(pingpong/modules)

    2019独角兽企业重金招聘Python工程师标准>>> 1.下载laravel5.2 http://laravelacademy.org/resources-download 2.解 ...

  9. 浅析React之事件系统(二)

    上篇文章中,我们谈到了React事件系统的实现方式,和在React中使用原生事件的方法,那么这篇文章我们来继续分析下,看看React中合成事件和原生事件混用的各种情况. 上一个例子 在上篇文章中,我们 ...

最新文章

  1. R语言使用pROC包绘制ROC曲线实战:roc函数计算AUC值、plot.roc函数绘制ROC曲线、添加置信区间、为回归模型中的每个因子绘制ROC曲线并在同一个图中显示出来
  2. pywinauto 记事本操作示例 移动鼠标 使用键盘 自动操作软件
  3. ajax无刷新方式对form表单进行赋值!
  4. VC mfc 多文档程序更改子文档标题名
  5. 经典的C++面试题目
  6. SEO中HTML标签权重
  7. 简单暴力到dp的优化(中级篇)
  8. .net一个函数要用另一个函数的值_VLOOKUP函数
  9. Windows Mobile 7(Photon) 梦幻之旅系列-前言
  10. 软件测试完后,还有bug,责任全在于测试吗?
  11. Twitter的分布式自增ID算法snowflake
  12. 十大常用算法(C++版)
  13. matlab画圆的命令_matlab画圆
  14. linux如何打开pkg软件,Linux系统pkg
  15. 基于MS强度或计数的数据依赖法非标记定量蛋白质组学的蛋白质互作分析(二)
  16. RedHat6.6安装thefuck工具,自动纠正错误命令
  17. C++中如何读取一个数的位数_R语言入门之切尾均值(trimmed mean)和绝对中位差(mad)...
  18. 在一个循环链队中只有尾指针(记为rear,结点结构为数据域data,指针域next),请给出这种队列的入队和出队操作的实现过程。
  19. 苹果cms播放器不能全屏播放解决方法
  20. Synchro plus SimTraffic 11.0.140.0中文版

热门文章

  1. 【Get 以太坊技能】CentOS 7 Geth 搭建私链
  2. windows下redis安装,注册成系统服务
  3. js 在新窗口中打开URL
  4. linux CentOS 7 安装 java1.8 (tar.gz)
  5. 清华计算机学院吴建平,吴建平
  6. 层和 native_React-Native与小程序的底层框架比较
  7. js清空本地存储_JS原理、方法与实践 本地存储
  8. python中的loop啥意思_python怎么进行loop
  9. rstudio python_如虎添翼:用Python与C++扩展R语言的应用场景
  10. sed 删除windows下的CR/LF