PagesProcessor.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <?php
  2. /**
  3. * @package Grav\Common\Processors
  4. *
  5. * @copyright Copyright (c) 2015 - 2022 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. $route = $this->container['route'];
  39. $this->container->fireEvent('onPagesInitialized', new Event(
  40. [
  41. 'pages' => $this->container['pages'],
  42. 'route' => $route,
  43. 'request' => $request
  44. ]
  45. ));
  46. $this->container->fireEvent('onPageInitialized', new Event(
  47. [
  48. 'page' => $this->container['page'],
  49. 'route' => $route,
  50. 'request' => $request
  51. ]
  52. ));
  53. /** @var PageInterface $page */
  54. $page = $this->container['page'];
  55. if (!$page->routable()) {
  56. $exception = new RequestException($request, 'Page Not Found', 404);
  57. // If no page found, fire event
  58. $event = new Event([
  59. 'page' => $page,
  60. 'code' => $exception->getCode(),
  61. 'message' => $exception->getMessage(),
  62. 'exception' => $exception,
  63. 'route' => $route,
  64. 'request' => $request
  65. ]);
  66. $event->page = null;
  67. $event = $this->container->fireEvent('onPageNotFound', $event);
  68. if (isset($event->page)) {
  69. unset($this->container['page']);
  70. $this->container['page'] = $page = $event->page;
  71. } else {
  72. throw new RuntimeException('Page Not Found', 404);
  73. }
  74. $this->addMessage("Routed to page {$page->rawRoute()} (type: {$page->template()}) [Not Found fallback]");
  75. } else {
  76. $this->addMessage("Routed to page {$page->rawRoute()} (type: {$page->template()})");
  77. $task = $this->container['task'];
  78. $action = $this->container['action'];
  79. /** @var Forms $forms */
  80. $forms = $this->container['forms'] ?? null;
  81. $form = $forms ? $forms->getActiveForm() : null;
  82. $options = ['page' => $page, 'form' => $form, 'request' => $request];
  83. if ($task) {
  84. $event = new Event(['task' => $task] + $options);
  85. $this->container->fireEvent('onPageTask', $event);
  86. $this->container->fireEvent('onPageTask.' . $task, $event);
  87. } elseif ($action) {
  88. $event = new Event(['action' => $action] + $options);
  89. $this->container->fireEvent('onPageAction', $event);
  90. $this->container->fireEvent('onPageAction.' . $action, $event);
  91. }
  92. }
  93. $this->stopTimer();
  94. return $handler->handle($request);
  95. }
  96. }