PagesProcessor.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. /**
  3. * @package Grav\Common\Processors
  4. *
  5. * @copyright Copyright (c) 2015 - 2021 Trilby Media, LLC. All rights reserved.
  6. * @license MIT License; see LICENSE file for details.
  7. */
  8. namespace Grav\Common\Processors;
  9. use Grav\Common\Page\Interfaces\PageInterface;
  10. use Grav\Framework\RequestHandler\Exception\RequestException;
  11. use Grav\Plugin\Form\Forms;
  12. use RocketTheme\Toolbox\Event\Event;
  13. use Psr\Http\Message\ResponseInterface;
  14. use Psr\Http\Message\ServerRequestInterface;
  15. use Psr\Http\Server\RequestHandlerInterface;
  16. use RuntimeException;
  17. /**
  18. * Class PagesProcessor
  19. * @package Grav\Common\Processors
  20. */
  21. class PagesProcessor extends ProcessorBase
  22. {
  23. /** @var string */
  24. public $id = 'pages';
  25. /** @var string */
  26. public $title = 'Pages';
  27. /**
  28. * @param ServerRequestInterface $request
  29. * @param RequestHandlerInterface $handler
  30. * @return ResponseInterface
  31. */
  32. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
  33. {
  34. $this->startTimer();
  35. // Dump Cache state
  36. $this->container['debugger']->addMessage($this->container['cache']->getCacheStatus());
  37. $this->container['pages']->init();
  38. $this->container->fireEvent('onPagesInitialized', new Event(['pages' => $this->container['pages']]));
  39. $this->container->fireEvent('onPageInitialized', new Event(['page' => $this->container['page']]));
  40. /** @var PageInterface $page */
  41. $page = $this->container['page'];
  42. if (!$page->routable()) {
  43. $exception = new RequestException($request, 'Page Not Found', 404);
  44. $route = $this->container['route'];
  45. // If no page found, fire event
  46. $event = new Event([
  47. 'page' => $page,
  48. 'code' => $exception->getCode(),
  49. 'message' => $exception->getMessage(),
  50. 'exception' => $exception,
  51. 'route' => $route,
  52. 'request' => $request
  53. ]);
  54. $event->page = null;
  55. $event = $this->container->fireEvent('onPageNotFound', $event);
  56. if (isset($event->page)) {
  57. unset($this->container['page']);
  58. $this->container['page'] = $page = $event->page;
  59. } else {
  60. throw new RuntimeException('Page Not Found', 404);
  61. }
  62. $this->addMessage("Routed to page {$page->rawRoute()} (type: {$page->template()}) [Not Found fallback]");
  63. } else {
  64. $this->addMessage("Routed to page {$page->rawRoute()} (type: {$page->template()})");
  65. $task = $this->container['task'];
  66. $action = $this->container['action'];
  67. /** @var Forms $forms */
  68. $forms = $this->container['forms'] ?? null;
  69. $form = $forms ? $forms->getActiveForm() : null;
  70. $options = ['page' => $page, 'form' => $form, 'request' => $request];
  71. if ($task) {
  72. $event = new Event(['task' => $task] + $options);
  73. $this->container->fireEvent('onPageTask', $event);
  74. $this->container->fireEvent('onPageTask.' . $task, $event);
  75. } elseif ($action) {
  76. $event = new Event(['action' => $action] + $options);
  77. $this->container->fireEvent('onPageAction', $event);
  78. $this->container->fireEvent('onPageAction.' . $action, $event);
  79. }
  80. }
  81. $this->stopTimer();
  82. return $handler->handle($request);
  83. }
  84. }