ellipse/dispatcher-adr

Psr-15 中间件分发器工厂,解析 ADR 定义

dev-master 2018-03-23 11:53 UTC

This package is auto-updated.

Last update: 2024-08-25 23:17:36 UTC


README

本包为实现了 Ellipse\DispatcherFactoryInterface 的对象提供了一个工厂装饰器,来自 ellipse/dispatcher 包。它允许使用 ADR 定义 来生成 Ellipse\Dispatcher 实例。

需求 php >= 7.0

安装 composer require ellipse/dispatcher-adr

运行测试 ./vendor/bin/kahlan

创建一个解析 ADR 定义的分发器工厂

本包提供了一个实现 Ellipse\DispatcherFactoryInterfaceEllipse\Dispatcher\ActionResolver 类,它允许装饰任何其他实现此接口的对象。

它接受一个实现 Psr\Container\ContainerInterface 的容器作为第一个参数,以及要装饰的工厂作为第二个参数。

装饰后,生成的分发器工厂可以通过解析 ADR 定义 来生成 Ellipse\Dispatcher 实例,这些实例作为 ellipse/handlers-adr 包中的 Ellipse\Handlers\ActionRequestHandler 实例。

<?php

namespace App;

use SomePsr11Container;

use Ellipse\DispatcherFactory;
use Ellipse\Dispatcher\ActionResolver;

// Get some Psr-11 container.
$container = new SomePsr11Container;

// Decorate a DispatcherFactoryInterface implementation with an ActionResolver.
$factory = new ActionResolver($container, new DispatcherFactory);

ADR 定义

ActionRequestHandler 实例需要一个实现 Ellipse\ADR\DomainInterface 的对象容器条目 ID、一个实现 Ellipse\Handlers\ResponderInterface 的对象容器条目 ID,以及一个可选的默认输入数组。ADR 定义定义了 ActionRequestHandler 应该使用的哪个 Domain 类、Responder 类以及默认输入。它可以有两种形式

  • 表示 Domain 类的完全限定名的字符串
  • 包含至少一个字符串作为第一个元素的数组,该字符串表示 Domain 类的完全限定名。可选地,可以指定 Responder 类的完全限定名和默认输入数组作为第二和第三个元素

例如,SomeDomain::class[SomeDomain::class][SomeDomain::class, SomeResponder::class][SomeDomain::class, SomeResponder::class, ['default' => 'value']] 都是有效的 ADR 定义,假设 SomeDomain 类实现了 DomainInterfaceSomeResponder 类实现了 ResponderInterface

当未指定 Responder 类名时(SomeDomain::class[SomeDomain::class]),用于检索 Responder 实例的容器条目 ID 默认为 Ellipse\Handlers\ResponderInterface。这允许在未定义任何 Responder 类的情况下使用默认的 Responder 类。

ActionRequestHandler 逻辑在 ellipse/handlers-adr 文档页面上描述。

<?php

namespace App;

use SomePsr11Container;

use Ellipse\DispatcherFactory;
use Ellipse\Dispatcher\ActionResolver;

// Get some Psr-11 container.
$container = new SomePsr11Container;

// Decorate a DispatcherFactoryInterface implementation with an ActionResolver.
$factory = new ActionResolver($container, new DispatcherFactory);

// Dispatchers using ADR definitions as Psr-15 request handler can now be created.
$dispatcher1 = $factory(SomeDomain::class, [new SomeMiddleware]);
$dispatcher2 = $factory([SomeDomain::class], [new SomeMiddleware]);
$dispatcher3 = $factory([SomeDomain::class, SomeResponder::class], [new SomeMiddleware]);
$dispatcher4 = $factory([SomeDomain::class, SomeResponder::class, ['default' => 'value']], [new SomeMiddleware]);