PagesServiceProvider.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. /**
  3. * @package Grav\Common\Service
  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\Service;
  9. use Grav\Common\Config\Config;
  10. use Grav\Common\Grav;
  11. use Grav\Common\Language\Language;
  12. use Grav\Common\Page\Page;
  13. use Grav\Common\Page\Pages;
  14. use Grav\Common\Uri;
  15. use Pimple\Container;
  16. use Pimple\ServiceProviderInterface;
  17. class PagesServiceProvider implements ServiceProviderInterface
  18. {
  19. public function register(Container $container)
  20. {
  21. $container['pages'] = function ($c) {
  22. return new Pages($c);
  23. };
  24. if (\defined('GRAV_CLI')) {
  25. $container['page'] = static function ($c) {
  26. $path = $c['locator']->findResource('system://pages/notfound.md');
  27. $page = new Page();
  28. $page->init(new \SplFileInfo($path));
  29. $page->routable(false);
  30. return $page;
  31. };
  32. return;
  33. }
  34. $container['page'] = function ($c) {
  35. /** @var Grav $c */
  36. /** @var Pages $pages */
  37. $pages = $c['pages'];
  38. /** @var Config $config */
  39. $config = $c['config'];
  40. /** @var Uri $uri */
  41. $uri = $c['uri'];
  42. $path = $uri->path() ?: '/'; // Don't trim to support trailing slash default routes
  43. $page = $pages->dispatch($path);
  44. // Redirection tests
  45. if ($page) {
  46. // some debugger override logic
  47. if ($page->debugger() === false) {
  48. $c['debugger']->enabled(false);
  49. }
  50. if ($config->get('system.force_ssl')) {
  51. if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
  52. $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
  53. $c->redirect($url);
  54. }
  55. }
  56. $url = $pages->route($page->route());
  57. if ($uri->params()) {
  58. if ($url === '/') { //Avoid double slash
  59. $url = $uri->params();
  60. } else {
  61. $url .= $uri->params();
  62. }
  63. }
  64. if ($uri->query()) {
  65. $url .= '?' . $uri->query();
  66. }
  67. if ($uri->fragment()) {
  68. $url .= '#' . $uri->fragment();
  69. }
  70. /** @var Language $language */
  71. $language = $c['language'];
  72. // Language-specific redirection scenarios
  73. if ($language->enabled() && ($language->isLanguageInUrl() xor $language->isIncludeDefaultLanguage())) {
  74. $c->redirect($url);
  75. }
  76. // Default route test and redirect
  77. if ($config->get('system.pages.redirect_default_route') && $page->route() !== $path) {
  78. $c->redirect($url);
  79. }
  80. }
  81. // if page is not found, try some fallback stuff
  82. if (!$page || !$page->routable()) {
  83. // Try fallback URL stuff...
  84. $page = $c->fallbackUrl($path);
  85. if (!$page) {
  86. $path = $c['locator']->findResource('system://pages/notfound.md');
  87. $page = new Page();
  88. $page->init(new \SplFileInfo($path));
  89. $page->routable(false);
  90. }
  91. }
  92. return $page;
  93. };
  94. }
  95. }