笔记:事件系统的快速上手 | laravel china 社区-江南app体育官方入口

写在前面

事件系统是一个简单的观察者模式的实现,允许你能够订阅监听在应用中的发生的各种事件。
事件系统可作为一个非常棒的方式来解耦你的业务,一个事件可以有多个监听者。例如:一个事件触发 一个通知,同步关联业务服务,推送三方平台等
事件类目录 app/events ,监听类/订阅类目录 app/listeners

快速开始

事件系统主要涉及:事件、监听者、订阅者、模型observer,以下结合日常使用习惯,对其进行简单的梳理说明

名词解释

事件:应用程序中发生的特定动作或状态变化,或者是某种状态改变/某个操作的触发
监听者:对特定事件作出响应的监听类。它订阅了一个或多个事件,并在事件发生时执行预定操作
订阅者:一种特殊的监听器,通常是一组监听器的集合,定义多个处理不同事件的方法
orm observer:框架 orm模型 事件监听的快速实现,就是模型的观察者实现

注册事件

使用 artisan 命令行来创建事件和监听者

# 创建事件
php artisan make:event loginevent
# 创建监听者
php artisan make:listener loginlistener --event=loginevent

服务提供者 app\providers\eventserviceprovider ,提供了一个属性 $listen 来注册事件监听者。
要求:统一使用 $listen 属性来手动注册。对 laravel 事件系统 支持的其他注册方式不予说明。
使用属性 $listen 注册,包含事件 (键) 和监听器 (值)。
参考代码:


namespace app\providers;
use app\events\loginevent;
use app\listeners\loginlistener;
use illuminate\auth\events\registered;
use illuminate\auth\listeners\sendemailverificationnotification;
use illuminate\foundation\support\providers\eventserviceprovider as serviceprovider;
use illuminate\support\facades\event;
class eventserviceprovider extends serviceprovider
{
    /**
     * the event to listener mappings for the application.
     *
     * @var array>
     */
    protected $listen = [
        registered::class => [
            sendemailverificationnotification::class,
        ],
        loginevent::class => [
            loginlistener::class,
        ],
    ];
    /**
     * the model observers to register.
     * @var array
     */
    protected $observers = [];
    /**
     * the subscribers to register.
     * @var array
     */
    protected $subscribe = [];
    /**
     * register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
    /**
     * determine if events and listeners should be automatically discovered.
     *
     * @return bool
     */
    public function shoulddiscoverevents()
    {
        return false;
    }
}

注意:

  1. 自动发现事件和监听器必须禁用!
/**
 * 确定是否应用自动发现事件和监听器。
 *
 * @return bool
 */
public function shoulddiscoverevents()
{
    return false;
}
  1. 属性 $observers 用来注册模型观察者,命令:
    # 模型 observer
    php artisan make:observer userobserver --model=user
    代码如下:
    /**
    * 应用程序的模型观察者。
    *
    * @var array
    */
    protected $observers = [
     user::class => [userobserver::class],
    ];
  2. 属性 $subscribe 注册订阅者,就理解为监听者的批量绑定即可,同样使用 artisan 命令:
    php artisan make:listener loginsubscribe
    不过这里需要通过 subscribe() 方法进行事件监听器注册。
    参考代码:

namespace app\listeners;
use app\events\loginevent;
use app\events\logoutevent;
use illuminate\contracts\queue\shouldqueue;
use illuminate\queue\interactswithqueue;
use illuminate\support\facades\log;
class loginsubscribe implements shouldqueue
{
    /**
     * 登录事件
     */
    public function handlelogin($event)
    {
        log::info('handlelogin: start');
        sleep(10);
        log::info('phone:' . $event->phone);
        log::info('handlelogin: end');
    }
    /**
     * 退出事件
     */
    public function handlelogout($event)
    {
        log::info('handlelogout: start');
        sleep(10);
        log::info('phone:' . $event->phone);
        log::info('handlelogout: end');
    }
    public function subscribe($events)
    {
        return [
            loginevent::class => 'handlelogin',
            logoutevent::class => 'handlelogout',
        ];
    }
}
  1. 使用监听器队列,只需将 shouldqueue 接口添加到监听器类即可
class loginlistener implements shouldqueue {}
class loginsubscribe implements shouldqueue {}

调度事件

事件分派/触发使用事件类的 dispatch() 方法, 传递给 dispatch() 方法的参数都将被传递给事件的构造函数,所以在事件类中注意接收!
而在监听类中,就可以使用 $event->property 访问事件的属性来获取调度事件时传递的参数!

    public function test(request $request)
    {
        $phone = '18011223344';
        loginevent::dispatch($phone);
        logoutevent::dispatch($phone);
    }

小结

laravel 的事件系统是开箱即用,借助其能力,可快速解耦,提高程序可维护性、可扩展性!
事件是一种介质/信号,表示系统中发生了某种情况;监听者则是方法/措施,是对发生的某种情况的反应!
监听者订阅者 是对事件作出反应的组件,定义了事件发生时应该执行的逻辑。而 订阅者 其实就是监听者,或者说是监听者的补充
模型observer 是监听和响应 orm模型生命周期 事件的 特殊类型的监听器,用于处理与数据库相关的业务逻辑。
参考文档:

本作品采用《cc 协议》,转载必须注明作者和本文链接
从零开发一个电商项目,功能包括电商后台、商品 & sku 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
以构建论坛项目 larabbs 为线索,展开对 laravel 框架的全面学习。应用程序架构思路贴近 laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
46
粉丝
8
喜欢
76
收藏
185
排名:494
访问:1.8 万
社区赞助商
网站地图