acairns / radiate

事件发射器

0.1.2 2016-09-30 18:10 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:53:16 UTC


README

Build Status Scrutinizer Code Quality Code Coverage

简介

Radiate 是一个用于管理事件的项目。

基本用法

简单创建一个 Emitter 实例并发射事件!

$emitter new Emitter($middleware);
$emitter->emit(new ExampleEvent);

创建发射器

Radiate 在创建时需要一系列的中间件。调用监听器所需的主要中间件是 InvokeListenerMiddleware 类的实例。

use Cairns\Radiate\Emitter;
use Cairns\Radiate\Inflector\HandleMethodInflector;
use Cairns\Radiate\Middleware\InvokeListenerMiddleware;

$invoker = new InvokeListenerMiddleware(
    $registry,
    $locator,
    $inflector
);

$emitter = new Cairns\Radiate\Emitter([
    $invoker
]);

为了调用监听器,中间件需要知道可用的监听器($registry),如何创建订阅的监听器的实例($locator)以及如何确定应该调用哪个方法($inflector)。

注册表

注册表是一个简单的类,负责跟踪所有已订阅的监听器。

定位器

定位器的责任是接受一个监听器的完全限定类名并返回一个实例。如果你使用依赖注入容器,那么这就是你想要解析具体实例的地方。

屈折词

屈折词的职责是在特定事件的情况下确定应在特定监听器上调用哪个方法。提供了一些屈折词用于常见的设置。

HandleMethodInflector

HandleMethodInflector 确保返回 handle() 方法。监听器可能看起来像这样

final class DisableTransporters
{
    public function handle(WarpDriveEngaged $event)
    {
        // Do Something
    }
}

TypehintMethodInflector

TypehintMethodInflector 确保返回依赖于事件类型的任何方法。监听器可能看起来像这样

final class DisableTransporters
{
    public function whenWarpDriveEngaged(WarpDriveEngaged $event)
    {
        // Do Something
    }

    public function whenShieldsWereRaised(ShieldsWereRaised $event)
    {
        // Do Something
    }
}

当使用 TypehintMethodInflector 时,你可以定义多个公共方法,这样同一个监听器就可以对不同的事件做出响应。

简单示例

final class WarpDriveEngaged
{
    private $speed;

    public function __construct($speed)
    {
        $this->speed = $speed;
    }

    public function getSpeed()
    {
        return $this->speed;
    }
}

final class DisableTransporters
{
    public function whenWarpDriveIsEngaged(WarpDriveEngaged $event)
    {
        // safety first!
    }
}

$registry = new \Cairns\Radiate\Registry\TypehintedClassRegistry;
$registry->register(DisableTransporters::class);

$locator = new Cairns\Radiate\Locator\InMemoryListenerLocator;
$locator->add(new DisableTransporters);

$invoker = new \Cairns\Radiate\Middleware\InvokeListenerMiddleware(
    $registry,
    $locator,
    new Cairns\Radiate\Inflector\TypehintMethodInflector
);

$emitter = new Cairns\Radiate\Emitter([
    $invoker
]);

$emitter->emit(new WarpDriveEngaged(9));

灵感

这个库受到了以下库的启发

贡献

尽管这目前只是一个实验,但我完全开放接受想法。提交一个PR吧!

如果你决定帮忙,以下是一些有用的检查事项

运行测试

$ ./vendor/bin/phpunit

代码嗅探器

$ ./vendor/bin/phpcs --standard=PSR2 ./src/

待办事项

  • 提升到 >=PHP7,更新代码库(返回类型,类型提示等)
  • 将示例提取到示例目录中
  • 使注册表可序列化,并可以从序列化的注册表构建