椭圆/调度控制器

Psr-15 中间件调度器工厂,解析控制器定义

1.1.2 2018-03-23 14:47 UTC

This package is auto-updated.

Last update: 2024-08-26 00:37:20 UTC


README

此包为从 ellipse/dispatcher 包实现的 Ellipse\DispatcherFactoryInterface 对象提供工厂装饰器。它允许使用 控制器定义 生成 Ellipse\Dispatcher 实例。

要求 php >= 7.0

安装 composer require ellipse/dispatcher-controller

运行测试 ./vendor/bin/kahlan

创建一个解析控制器定义的调度器工厂

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

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

一旦装饰,生成的调度器工厂可以通过解析 控制器定义Ellipse\Handlers\ControllerRequestHandler 实例来生成 Ellipse\Dispatcher 的实例,这些实例来自 ellipse/handlers-controller 包。

<?php

namespace App;

use SomePsr11Container;

use Ellipse\DispatcherFactory;
use Ellipse\Dispatcher\ControllerResolver;

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

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

控制器定义

ControllerRequestHandler 实例需要用作控制器的对象的容器条目 ID、方法名和可选的请求属性名数组。

  • 控制器定义指定了 ControllerRequestHandler 应使用的控制器类、方法名和请求属性。它是一个至少包含两个字符串元素的数组
  • 第一个是控制器的完全限定类名
  • 第二个是执行的控制器的名称,前面加上 '@'

可选的第三个元素是表示用于调用控制器方法时作为参数使用的请求属性名的字符串数组

例如 [SomeController::class, '@index'][SomeController::class, '@show', ['some_id']] 是有效的控制器定义。第一个执行 SomeController 类的 ->index() 方法,第二个使用名为 'some_id' 的请求属性值作为参数执行其 ->show($id) 方法。

ControllerRequestHandler 逻辑在 ellipse/handlers-controller 文档页面中描述。

<?php

namespace App;

use SomePsr11Container;

use Ellipse\DispatcherFactory;
use Ellipse\Dispatcher\ControllerResolver;

use App\Controllers\SomeController;

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

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

// Dispatchers using controller definitions as Psr-15 request handler can now be created.
$dispatcher1 = $factory([SomeController::class, '@index'], [new SomeMiddleware]);
$dispatcher2 = $factory([SomeController::class, '@show', ['some_id']], [new SomeMiddleware]);
$dispatcher3 = $factory([SomeController::class, '@store'], [new SomeMiddleware]);