项目作者: ellipsephp

项目描述 :
Composable dispatcher factory
高级语言: PHP
项目地址: git://github.com/ellipsephp/dispatcher-composable.git
创建时间: 2018-03-13T13:52:56Z
项目社区:https://github.com/ellipsephp/dispatcher-composable

开源协议:MIT License

下载


Composable resolver

This package provides a composable factory decorator for objects implementing Ellipse\DispatcherFactoryInterface from ellipse/dispatcher package.

Require php >= 7.0

Installation composer require ellipse/dispatcher-composable

Run tests ./vendor/bin/kahlan

Composing a dispatcher

Sometimes a dispatcher needs to be composed at runtime according to certain conditions. When routing for example: a solution is needed to build a dispatcher using different middleware queues and request handlers according to the matched route.

For this purpose this package provides an Ellipse\Dispatcher\ComposableResolver class which takes an implementation of DispatcherFactoryInterface and a middleware queue as constructor parameters. Dispatchers produced by this resolver are wrapped inside this middleware queue. It also have a ->with() method taking a middleware queue as parameter and returning a new ComposableResolver with those middleware added to the queue.

Let’s have an example using FastRoute:

  1. <?php
  2. namespace App;
  3. use FastRoute\RouteCollector;
  4. use Ellipse\DispatcherFactory;
  5. use Ellipse\Dispatcher\ComposableResolver;
  6. // Create a new ComposableResolver.
  7. $factory = new ComposableResolver(new DispatcherFactory);
  8. // Create a new FastRoute route collector.
  9. $r = new RouteCollector(...);
  10. // Those middleware will be wrapped around all the dispatchers.
  11. $factory = $factory->with([
  12. new SomeMiddleware1,
  13. new SomeMiddleware2,
  14. ]);
  15. // The dispatcher matching the GET / route will use SomeMiddleware1, SomeMiddleware2 and RequestHandler1.
  16. $r->get('/', $factory(new RequestHandler1));
  17. // Let's have a first route group.
  18. $r->group('/group1', function ($r) use ($factory) {
  19. // SomeMiddleware3 is specific to this route group.
  20. $factory = $factory->with([new SomeMiddleware3]);
  21. // The dispatcher matching the GET /group1/route1 route will use SomeMiddleware1, SomeMiddleware2, SomeMiddleware3 and RequestHandler2.
  22. $r->get('/route1', $factory(new RequestHandler2));
  23. // The dispatcher matching the GET /group1/route2 route will use SomeMiddleware1, SomeMiddleware2, SomeMiddleware3 and RequestHandler3.
  24. $r->get('/route2', $factory(new RequestHandler3));
  25. });
  26. // And a second route group.
  27. $r->group('/group2', function ($r) use ($factory) {
  28. // SomeMiddleware4 is specific to this route group.
  29. $factory = $factory->with([new SomeMiddleware4]);
  30. // The dispatcher matching the GET /group2/route1 route will use SomeMiddleware1, SomeMiddleware2, SomeMiddleware4 and RequestHandler4.
  31. $r->get('/route1', $factory(new RequestHandler4));
  32. // Also middleware can be added on a per route basis.
  33. $r->get('/route2', $factory(new RequestHandler5, [
  34. new SomeMiddleware5,
  35. ]));
  36. });

Of course, ComposableResolver can decorate any implementation of DispatcherFactoryInterface. For example the CallableResolver class from the ellipse/dispatcher-callable package:

  1. <?php
  2. namespace App;
  3. use FastRoute\RouteCollector;
  4. use Ellipse\DispatcherFactory;
  5. use Ellipse\Dispatcher\ComposableResolver;
  6. use Ellipse\Dispatcher\CallableResolver;
  7. // Create a new ComposableResolver resolving callables.
  8. $factory = new ComposableResolver(
  9. new CallableResolver(
  10. new DispatcherFactory
  11. )
  12. );
  13. // Create a new FastRoute route collector.
  14. $r = new RouteCollector(...);
  15. // Callables can be used as Psr-15 middleware.
  16. $factory = $factory->with([
  17. function ($request, $handler) {
  18. // This callable behave like a Psr-15 middleware.
  19. },
  20. ]);
  21. // Callables can be used as request handlers too.
  22. $r->get('/', $factory(function ($request) {
  23. // This callable behave like a Psr-15 request handler.
  24. }))