InitializeProcessor.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. /**
  3. * @package Grav\Common\Processors
  4. *
  5. * @copyright Copyright (C) 2015 - 2019 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\Config\Config;
  10. use Grav\Common\Grav;
  11. use Grav\Common\Uri;
  12. use Grav\Common\Utils;
  13. use Grav\Framework\Session\Exceptions\SessionException;
  14. use Psr\Http\Message\ResponseInterface;
  15. use Psr\Http\Message\ServerRequestInterface;
  16. use Psr\Http\Server\RequestHandlerInterface;
  17. class InitializeProcessor extends ProcessorBase
  18. {
  19. public $id = 'init';
  20. public $title = 'Initialize';
  21. /** @var bool */
  22. private static $cli_initialized = false;
  23. /**
  24. * @param Grav $grav
  25. */
  26. public static function initializeCli(Grav $grav)
  27. {
  28. if (!static::$cli_initialized) {
  29. static::$cli_initialized = true;
  30. $instance = new static($grav);
  31. $instance->processCli();
  32. }
  33. }
  34. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface
  35. {
  36. $this->startTimer();
  37. /** @var Config $config */
  38. $config = $this->container['config'];
  39. $config->debug();
  40. // Use output buffering to prevent headers from being sent too early.
  41. ob_start();
  42. if ($config->get('system.cache.gzip') && !@ob_start('ob_gzhandler')) {
  43. // Enable zip/deflate with a fallback in case of if browser does not support compressing.
  44. ob_start();
  45. }
  46. // Initialize the timezone.
  47. $timezone = $config->get('system.timezone');
  48. if ($timezone) {
  49. date_default_timezone_set($timezone);
  50. }
  51. // FIXME: Initialize session should happen later after plugins have been loaded. This is a workaround to fix session issues in AWS.
  52. if (isset($this->container['session']) && $config->get('system.session.initialize', true)) {
  53. // TODO: remove in 2.0.
  54. $this->container['accounts'];
  55. try {
  56. $this->container['session']->init();
  57. } catch (SessionException $e) {
  58. $this->container['session']->init();
  59. $message = 'Session corruption detected, restarting session...';
  60. $this->addMessage($message);
  61. $this->container['messages']->add($message, 'error');
  62. }
  63. }
  64. /** @var Uri $uri */
  65. $uri = $this->container['uri'];
  66. $uri->init();
  67. // Redirect pages with trailing slash if configured to do so.
  68. $path = $uri->path() ?: '/';
  69. if ($path !== '/'
  70. && $config->get('system.pages.redirect_trailing_slash', false)
  71. && Utils::endsWith($path, '/')) {
  72. $redirect = (string) $uri::getCurrentRoute()->toString();
  73. $this->container->redirect($redirect);
  74. }
  75. $this->container->setLocale();
  76. $this->stopTimer();
  77. return $handler->handle($request);
  78. }
  79. public function processCli(): void
  80. {
  81. // Load configuration.
  82. $this->container['config']->init();
  83. $this->container['plugins']->setup();
  84. // Disable debugger.
  85. $this->container['debugger']->enabled(false);
  86. // Set timezone, locale.
  87. /** @var Config $config */
  88. $config = $this->container['config'];
  89. $timezone = $config->get('system.timezone');
  90. if ($timezone) {
  91. date_default_timezone_set($timezone);
  92. }
  93. $this->container->setLocale();
  94. // Load plugins.
  95. $this->container['plugins']->init();
  96. // Initialize URI.
  97. /** @var Uri $uri */
  98. $uri = $this->container['uri'];
  99. $uri->init();
  100. // Load accounts.
  101. // TODO: remove in 2.0.
  102. $this->container['accounts'];
  103. }
  104. }