事件调度

我们在一些需要扩展的代码进行 预埋点 ,每个预埋点会定义一个唯一的 事件名,并且使用 监听器 对这个事件名进行监听,一旦这个预埋点被 触发器 触发则会执行监听器中的代码。

通过事件调度可以实现模块化代码的解耦合,Dux 采用 symfony事件调度器。

定义事件

创建一个事件类以便监听器和触发器进行调用,为了统一架构请将事件类放置在每个应用中的 Event 目录。


namespace App\Example\Event;

use Symfony\Contracts\EventDispatcher\Event;

class TestEvent extends Event
{
}

您可以在事件类中定义任意方法以供监听器和触发器使用,如下:

namespace App\Example\Event;

use Symfony\Contracts\EventDispatcher\Event;

class TestEvent extends Event
{
    public function __construct(
        // 初始化一个名称
        public string $name
    )
    {}
    public function set($name): void
    {
        // 覆盖名称
        $this->name = $name;
    }
    public function get(): string
    {
        // 获取名称
        return $this->name;
    }
}

监听事件

事件监听为任意方法函数,并且使用注解类 Listener 进行声明要监听的事件,为了统一架构请将监听器放置在每个应用中的 Listener 目录。

namespace App\Example\Listener;

use Dux\Event\Attribute\Listener;

use Dux\Example\Event\TestEvent;

class TestListener
{
    #[Listener(name: 'test')]
    public function data(TestEvent $event): void
    {
        // 输出初始化值
        echo $event->get();
        $event->set("hello world!");
    }
}

触发事件

使用触发器对刚刚注册的事件进行调用:

// 初始化事件
$event = new TestEvent('hello');

// 针对名为 test 的事件进行触发,并且传递事件类
\Dux\App::event()->dispatch($event, 'test');
// hello

// 触发后获取值
echo $event->get();
// hello world!