RequestHandlerTrait.php 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <?php
  2. /**
  3. * @package Grav\Framework\RequestHandler
  4. *
  5. * @copyright Copyright (c) 2015 - 2022 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. declare(strict_types=1);
  9. namespace Grav\Framework\RequestHandler\Traits;
  10. use Grav\Framework\RequestHandler\Exception\InvalidArgumentException;
  11. use Psr\Container\ContainerInterface;
  12. use Psr\Http\Message\ResponseInterface;
  13. use Psr\Http\Message\ServerRequestInterface;
  14. use Psr\Http\Server\MiddlewareInterface;
  15. use function call_user_func;
  16. /**
  17. * Trait RequestHandlerTrait
  18. * @package Grav\Framework\RequestHandler\Traits
  19. */
  20. trait RequestHandlerTrait
  21. {
  22. /** @var array<int,string|MiddlewareInterface> */
  23. protected $middleware;
  24. /** @var callable */
  25. protected $handler;
  26. /** @var ContainerInterface|null */
  27. protected $container;
  28. /**
  29. * {@inheritdoc}
  30. * @throws InvalidArgumentException
  31. */
  32. public function handle(ServerRequestInterface $request): ResponseInterface
  33. {
  34. $middleware = array_shift($this->middleware);
  35. // Use default callable if there is no middleware.
  36. if ($middleware === null) {
  37. return call_user_func($this->handler, $request);
  38. }
  39. if ($middleware instanceof MiddlewareInterface) {
  40. return $middleware->process($request, clone $this);
  41. }
  42. if (null === $this->container || !$this->container->has($middleware)) {
  43. throw new InvalidArgumentException(
  44. sprintf('The middleware is not a valid %s and is not passed in the Container', MiddlewareInterface::class),
  45. $middleware
  46. );
  47. }
  48. array_unshift($this->middleware, $this->container->get($middleware));
  49. return $this->handle($request);
  50. }
  51. }