ssnepenthe/wp-event-dispatcher

WordPress钩子的事件调度器抽象

0.1.0 2023-11-19 23:04 UTC

This package is auto-updated.

Last update: 2024-09-20 01:01:32 UTC


README

这是一个简单的WordPress钩子事件调度器抽象。

警告

该软件包目前正在开发中,并且直到v1.0版本被标记之前,可能会没有通知地进行破坏性更改。

它是我在GitHub上WordPress玩具系列中的一员,我一直在努力探索使WordPress工作现代化的方法。

正如标签所示,它应被视为一个玩具。

安装

composer require ssnepenthe/wp-event-dispatcher

概述

事件调度器(WpEventDispatcher\EventDispatcherInterface)鼓励将事件封装到专用的事件类中,将事件监听器封装到专用的事件订阅者类中。

使用方法

事件调度器旨在替换对WordPress提供的各种操作和过滤器函数的直接调用。

事件调度器摒弃了操作和过滤器的概念。事件被封装在独立的事件类中。如果您想“过滤”一个值,请使用事件类的类型属性或设置器/获取器。事件监听器可以是独立的可调用对象,但最好通过订阅者类实现。

这大致模仿了Symfony事件调度器组件,但使用WordPress钩子作为幕后。

您将使用的主要方法是dispatchaddListeneraddSubscriber

默认情况下,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());