Context.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <?php
  2. namespace Tools;
  3. /**
  4. * Cms context
  5. * Contains all website informations
  6. * Will be passed to themes files and to modules
  7. **/
  8. class Context
  9. {
  10. /**
  11. * @var \Tools\Hooks $hookManager
  12. * /core/tools/Hooks.php
  13. * allow triggering hooks and registers module's endpoints
  14. * Can be accessed read-only via $instance->hookManager
  15. **/
  16. private $hookManager;
  17. /**
  18. * @var \Tools\Context $instance Singleton value
  19. **/
  20. private static $instance;
  21. /**
  22. * @var \Tools\ModuleManager $moduleManager
  23. * /core/tools/ModuleManager.php
  24. * load all active modules and contains informations about them
  25. * Can be accessed read-only via $instance->moduleManager
  26. **/
  27. private $moduleManager;
  28. /**
  29. * @var \Tools\Router $router
  30. * /core/tools/Router.php
  31. * Contains information about directories and paths
  32. * Allow user to generate links
  33. * Can be accessed read-only via $instance->router
  34. **/
  35. private $router;
  36. /**
  37. * TODO
  38. * @var \Tools\Cart $cart
  39. * /core/tools/Cart.php
  40. * Not defined yet
  41. * Can be accessed read-only via $instance->cart
  42. **/
  43. private $cart;
  44. /**
  45. * TODO
  46. * @var \Tools\User $user (entity ?)
  47. * /core/tools/User.php
  48. * Can be accessed read-only via $instance->user
  49. **/
  50. private $user;
  51. /**
  52. * @var \Tools\AController $controller
  53. * /core/tools/AController.php
  54. * Controller being called by user's request
  55. **/
  56. private $controller;
  57. /**
  58. * @var string $ip
  59. * Contains the remote client's IP, or empty
  60. * Can be accessed via ->ip
  61. **/
  62. private $ip;
  63. /**
  64. * @var array $server
  65. * contains $_SERVER or Unit test environment
  66. **/
  67. private $server;
  68. /**
  69. * Create context from $_SERVER environment
  70. * and initialize all data
  71. * @param array $server optional, contains $_SERVER configuration
  72. * -> REMOTE_ADDR client's ip
  73. * -> SCRIPT_NAME
  74. * -> DOCUMENT_ROOT
  75. * -> REQUEST_SCHEME 'http:https'
  76. * -> REQUEST_URI
  77. * -> HTTP_HOST
  78. **/
  79. public function __construct($server = null)
  80. {
  81. self::$instance = $this;
  82. if ($server == null)
  83. $server = $_SERVER;
  84. $this->ip = $server["REMOTE_ADDR"];
  85. $this->hookManager = new Hooks($this);
  86. $this->server = $server;
  87. $this->router = new Router($this->server, $this);
  88. }
  89. public function serve()
  90. {
  91. // @codeCoverageIgnoreStart
  92. if (!\Entity\ModelBase::init())
  93. {
  94. @require_once(getcwd().'/core/setup/index.php');
  95. die;
  96. }
  97. // @codeCoverageIgnoreEnd
  98. $this->router->init($this->server);
  99. $this->moduleManager = new ModuleManager($this);
  100. $this->hookManager->trigger("routerSetup");
  101. try
  102. {
  103. $this->controller = $this->router->serveUrl();
  104. if (!$this->controller)
  105. throw new \Exception\Error404();
  106. }
  107. catch (\Exception\Error404 $e)
  108. {
  109. $this->controller = new \Controller\Error404($this, array());
  110. }
  111. }
  112. /**
  113. * Getter function
  114. **/
  115. public function __get($key)
  116. {
  117. switch ($key)
  118. {
  119. case "router": return $this->router; break;
  120. case "cart": return $this->cart; break;
  121. case "user": return $this->user; break;
  122. case "moduleManager": return $this->moduleManager; break;
  123. case "hookManager": return $this->hookManager; break;
  124. case "ip": return $this->ip; break;
  125. case "controller": return $this->controller; break;
  126. }
  127. throw new \Exception("Cannot access attribute {$key}");
  128. }
  129. /**
  130. * Check if executed from phpUnit
  131. **/
  132. public function isTestingEnvironment()
  133. {
  134. return isset($this->server["phpUnit"]) && $this->server["phpUnit"] == true;
  135. }
  136. /**
  137. * @return \Tools\Context context
  138. * Get the last Context instance
  139. **/
  140. public static function getContext()
  141. {
  142. return self::$instance;
  143. }
  144. }