事件订阅者

Laravel 的事件系统 中说到,一个事件可以对应多个监听器,但一个监听器只监听一个事件。

那么如果想在一个类中订阅多个事件,例如在订单发货、签收、退货事件发生时,都需要进行“发短信操作”,该如何处理呢,这时候可以使用事件订阅者。

事件订阅者可以在类内部订阅多个事件,即在单个类中定义多个事件处理器。

编写事件订阅者

<?php

namespace App\Listeners;

use Illuminate\Auth\Events\Login;
use Illuminate\Auth\Events\Logout;

class UserEventSubscriber
{
    /**
     * 处理用户登录事件
     */
    public function handleUserLogin($event) {}

    /**
     * 处理用户注销事件
     */
    public function handleUserLogout($event) {}

    /**
     * 为事件订阅者注册监听器
     *
     * @return array
     */
    public function subscribe()
    {
        return [
            Login::class => [UserEventSubscriber::class, 'handleUserLogin'],
            Logout::class => [UserEventSubscriber::class, 'handleUserLogout'],
        ];
    }
}

注册事件订阅者

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * 应用的事件监听器映射
     */
    protected $listen = [
        //
    ];

    /**
     * 被注册的订阅者类
     */
    protected $subscribe = [
        'App\Listeners\UserEventSubscriber',
    ];
}

小伍
139 声望4 粉丝