ssnepenthe / wp-event-dispatcher
WordPress钩子的事件调度器抽象
Requires
- php: ^7.4 || ^8.0
Requires (Dev)
- brain/monkey: ^2.6.1
- phpunit/phpunit: ^9.0 || ^10.0
README
这是一个简单的WordPress钩子事件调度器抽象。
警告
该软件包目前正在开发中,并且直到v1.0版本被标记之前,可能会没有通知地进行破坏性更改。
它是我在GitHub上WordPress玩具系列中的一员,我一直在努力探索使WordPress工作现代化的方法。
正如标签所示,它应被视为一个玩具。
安装
composer require ssnepenthe/wp-event-dispatcher
概述
事件调度器(WpEventDispatcher\EventDispatcherInterface
)鼓励将事件封装到专用的事件类中,将事件监听器封装到专用的事件订阅者类中。
使用方法
事件调度器旨在替换对WordPress提供的各种操作和过滤器函数的直接调用。
事件调度器摒弃了操作和过滤器的概念。事件被封装在独立的事件类中。如果您想“过滤”一个值,请使用事件类的类型属性或设置器/获取器。事件监听器可以是独立的可调用对象,但最好通过订阅者类实现。
这大致模仿了Symfony事件调度器组件,但使用WordPress钩子作为幕后。
您将使用的主要方法是dispatch
、addListener
和addSubscriber
。
默认情况下,dispatch
使用事件类的FQCN作为事件名称。如果事件需要一个动态名称,则应实现WpEventDispatcher\NamedEventInterface
接口。
与标准WordPress钩子相比,事件调度器可能需要一些额外的模板代码,但提供了您在其他情况下不会得到的类型安全性和自动完成功能。
以下是一个如何替换WordPress操作的简单示例
之前
add_action('my_plugin_initialized', function () { // ... }); do_action('my_plugin_initialized');
之后
class MyPluginInitialized { } $eventDispatcher = new EventDispatcher(); $eventDispatcher->addListener(MyPluginInitialized::class, function (MyPluginInitialized $event) { // ... }); $eventDispatcher->dispatch(new MyPluginInitialized());
以下是如何替换过滤器的一个示例
之前
add_filter('my_plugin_filtered_value', function ($value) { if (is_string($value)) { $value = modifyValue($value); } return $value; }); $default = 'some string'; $value = apply_filters('my_plugin_filtered_value', $default); if (! is_string($value)) { $value = $default; }
之后
class MyPluginFilteredValue { public function __construct(public string $value) { } } $eventDispatcher = new EventDispatcher(); $eventDispatcher->addListener(MyPluginFilteredValue::class, function (MyPluginFilteredValue $event) { $event->value = modifyValue($event->value); }); $event = new MyPluginFilteredValue('some string'); $eventDispatcher->dispatch($event); $value = $event->value;
事件调度器还允许将事件监听器在订阅者类中逻辑分组。
订阅者应实现WpEventDispatcher\SubscriberInterface
接口。
此接口有一个方法 - getSubscribedEvents
。它应返回以下任一格式的数组
数组键是钩子标签名称,值是此订阅者实例上用作监听器的方法名称。
return [ 'the_content' => 'onTheContent', ];
数组键是钩子标签名称,值是包含方法名称(索引0)和可选优先级(索引1)的数组。
return [ 'the_content' => ['onTheContent', 20], ];
数组键是钩子标签名称,值是包含方法名称(索引0)和可选优先级(索引1)的数组数组。
return [ 'the_content' => [ ['onTheContent', 20], ['alsoOnTheContent'], ], ];
(非常牵强的)示例
class PostContentSubscriber implements SubscriberInterface { public function getSubscribedEvents(): array { return [ 'the_content' => [ ['appendSomething'], ['prependAnotherThing', 20], ], ]; } public function appendSomething($content) { return $content . ' something'; } public function prependAnotherThing($content) { return 'another thing ' . $content; } }
通过事件调度器的addSubscriber
方法初始化订阅者
$eventDispatcher->addSubscriber(new PostContentSubscriber());