官方文档中的代码实测有误

return [
    'bind'    =>    [
        'UserLogin' => 'app\event\UserLogin',
        // 更多事件绑定
    ],
    'listen'  =>    [
        'UserLogin'    =>    ['app\listener\UserLogin'],
        // 更多事件监听
    ],
];

实际表现应该是

return [
    'bind'    =>    [
        'ul' => 'UserLogin',
        // 更多事件绑定
    ],
    'listen'  =>    [
        'UserLogin'    =>    ['app\listener\UserLogin'],
        // 更多事件监听
    ],
];

这样使用

Event::trigger('UserLogin');

或者

Event::trigger('ul');

或者

event('UserLogin');

或者

event('ul');

都能够生效,也就是说,event.php 中的 bind 配置实质上起到的是一个别名的功能,直接不配置也不会影响使用


使用一个事件标识,触发多个后续流程,订阅方法:
在AppService.php中注册多个订阅类

public function register()
{
    // 服务注册
    Event::subscribe('app\index\subscribe\Animal');
    Event::subscribe('app\index\subscribe\User');
}

创建对应的订阅类 Animal

<?php
declare (strict_types = 1);

namespace app\index\subscribe;
use think\Event;

class Animal
{
    public function onLogin($user)
    {
        echo "Animal onLogin<br>";
    }
}

创建对应的订阅类 User

<?php
declare (strict_types = 1);

namespace app\index\subscribe;
use think\Event;

class User
{
    // protected $eventPrefix = 'User';

    public function onLogin($user)
    {
        // UserLogin事件响应处理
        echo "User onLogin<br>";
    }
}

使用事件标识触发事件

public function index()
{
    Event::trigger('Login');

    echo "index/index/index";
}

就能得到:

Animal onLogin
User onLogin
index/index/index


使用一个事件标识,触发多个后续流程,监听方法:
在AppService.php中注册多个订阅类

public function register()
{
    // 服务注册
    Event::listen('AnimalListener', 'app\index\listener\Cat');
    Event::listen('AnimalListener', 'app\index\listener\Dog');
}

创建对应的监听类 Cat

<?php
declare (strict_types = 1);

namespace app\index\listener;

class Cat
{
     /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        echo "cat handle<br>";
    }
}

创建对应的监听类 Dog

<?php
declare (strict_types = 1);

namespace app\index\listener;

class Dog
{
     /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        echo "dog handle<br>";
    }
}

使用事件标识触发事件

public function index()
{
    Event::trigger('AnimalListener');

    echo "index/index/index";
}

就能得到:

cat handle
dog handle
index/index/index

或者直接在event.php直接配置好,就不需要在AppService中动态注册

<?php
// 事件定义文件
return [
    'bind'      => [
    ],

    'listen'    => [
        'AppInit'  => [],
        'HttpRun'  => [],
        'HttpEnd'  => [],
        'LogLevel' => [],
        'LogWrite' => [],
        'AnimalListener' => [
            'app\index\listener\Cat',
            'app\index\listener\Dog'
        ]
    ],

    'subscribe' => [
    ],
];

使用事件标识触发事件

public function index()
{
    Event::trigger('AnimalListener');

    echo "index/index/index";
}

也能得到:

cat handle
dog handle
index/index/index

标签: none