PagesProcessor.php 3.8 KB

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