PageServiceProvider.php 3.1 KB

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