我们在一些需要扩展的代码进行 预埋点
,每个预埋点会定义一个唯一的 事件名
,并且使用 监听器
对这个事件名进行监听,一旦这个预埋点被 触发器
触发则会执行监听器中的代码。
通过事件调度可以实现模块化代码的解耦合,Dux 采用 symfony事件调度器。
Read more in Symfony Event
创建一个事件类以便监听器和触发器进行调用,为了统一架构请将事件类放置在每个应用中的 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!