PagesServiceProvider.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. $container['page'] = function ($c) {
  25. /** @var Grav $c */
  26. /** @var Pages $pages */
  27. $pages = $c['pages'];
  28. /** @var Config $config */
  29. $config = $c['config'];
  30. /** @var Uri $uri */
  31. $uri = $c['uri'];
  32. $path = $uri->path() ?: '/'; // Don't trim to support trailing slash default routes
  33. $page = $pages->dispatch($path);
  34. // Redirection tests
  35. if ($page) {
  36. // some debugger override logic
  37. if ($page->debugger() === false) {
  38. $c['debugger']->enabled(false);
  39. }
  40. if ($config->get('system.force_ssl')) {
  41. if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
  42. $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
  43. $c->redirect($url);
  44. }
  45. }
  46. $url = $pages->route($page->route());
  47. if ($uri->params()) {
  48. if ($url === '/') { //Avoid double slash
  49. $url = $uri->params();
  50. } else {
  51. $url .= $uri->params();
  52. }
  53. }
  54. if ($uri->query()) {
  55. $url .= '?' . $uri->query();
  56. }
  57. if ($uri->fragment()) {
  58. $url .= '#' . $uri->fragment();
  59. }
  60. /** @var Language $language */
  61. $language = $c['language'];
  62. // Language-specific redirection scenarios
  63. if ($language->enabled() && ($language->isLanguageInUrl() xor $language->isIncludeDefaultLanguage())) {
  64. $c->redirect($url);
  65. }
  66. // Default route test and redirect
  67. if ($config->get('system.pages.redirect_default_route') && $page->route() !== $path) {
  68. $c->redirect($url);
  69. }
  70. }
  71. // if page is not found, try some fallback stuff
  72. if (!$page || !$page->routable()) {
  73. // Try fallback URL stuff...
  74. $page = $c->fallbackUrl($path);
  75. if (!$page) {
  76. $path = $c['locator']->findResource('system://pages/notfound.md');
  77. $page = new Page();
  78. $page->init(new \SplFileInfo($path));
  79. $page->routable(false);
  80. }
  81. }
  82. return $page;
  83. };
  84. }
  85. }