ellipse / dispatcher-composable
可组合的调度器工厂
1.0.0
2018-03-13 14:54 UTC
Requires
- php: >=7.0
- ellipse/dispatcher: ^1.6
Requires (Dev)
- eloquent/phony-kahlan: ^1.0
- kahlan/kahlan: ^4.0
This package is auto-updated.
Last update: 2024-08-26 00:54:37 UTC
README
此包为从ellipse/dispatcher包中实现的Ellipse\DispatcherFactoryInterface
对象提供了一个可组合的工厂装饰器。
要求 php >= 7.0
安装 composer require ellipse/dispatcher-composable
运行测试 ./vendor/bin/kahlan
组合调度器
有时需要根据某些条件在运行时组合调度器。例如,在路由时,需要一个解决方案,根据匹配的路由使用不同的中间件队列和请求处理器来构建调度器。
为此,此包提供了一个Ellipse\Dispatcher\ComposableResolver
类,它接受一个DispatcherFactoryInterface
的实现和一个中间件队列作为构造函数参数。由该解析器产生的调度器被包装在这个中间件队列中。它还有一个接受中间件队列作为参数的->with()
方法,并返回一个将那些中间件添加到队列中的新ComposableResolver
。
以下是一个使用FastRoute的示例
<?php namespace App; use FastRoute\RouteCollector; use Ellipse\DispatcherFactory; use Ellipse\Dispatcher\ComposableResolver; // Create a new ComposableResolver. $factory = new ComposableResolver(new DispatcherFactory); // Create a new FastRoute route collector. $r = new RouteCollector(...); // Those middleware will be wrapped around all the dispatchers. $factory = $factory->with([ new SomeMiddleware1, new SomeMiddleware2, ]); // The dispatcher matching the GET / route will use SomeMiddleware1, SomeMiddleware2 and RequestHandler1. $r->get('/', $factory(new RequestHandler1)); // Let's have a first route group. $r->group('/group1', function ($r) use ($factory) { // SomeMiddleware3 is specific to this route group. $factory = $factory->with([new SomeMiddleware3]); // The dispatcher matching the GET /group1/route1 route will use SomeMiddleware1, SomeMiddleware2, SomeMiddleware3 and RequestHandler2. $r->get('/route1', $factory(new RequestHandler2)); // The dispatcher matching the GET /group1/route2 route will use SomeMiddleware1, SomeMiddleware2, SomeMiddleware3 and RequestHandler3. $r->get('/route2', $factory(new RequestHandler3)); }); // And a second route group. $r->group('/group2', function ($r) use ($factory) { // SomeMiddleware4 is specific to this route group. $factory = $factory->with([new SomeMiddleware4]); // The dispatcher matching the GET /group2/route1 route will use SomeMiddleware1, SomeMiddleware2, SomeMiddleware4 and RequestHandler4. $r->get('/route1', $factory(new RequestHandler4)); // Also middleware can be added on a per route basis. $r->get('/route2', $factory(new RequestHandler5, [ new SomeMiddleware5, ])); });
当然,ComposableResolver
可以装饰任何DispatcherFactoryInterface
的实现。例如,来自ellipse/dispatcher-callable包的CallableResolver
类
<?php namespace App; use FastRoute\RouteCollector; use Ellipse\DispatcherFactory; use Ellipse\Dispatcher\ComposableResolver; use Ellipse\Dispatcher\CallableResolver; // Create a new ComposableResolver resolving callables. $factory = new ComposableResolver( new CallableResolver( new DispatcherFactory ) ); // Create a new FastRoute route collector. $r = new RouteCollector(...); // Callables can be used as Psr-15 middleware. $factory = $factory->with([ function ($request, $handler) { // This callable behave like a Psr-15 middleware. }, ]); // Callables can be used as request handlers too. $r->get('/', $factory(function ($request) { // This callable behave like a Psr-15 request handler. }))