Application.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. spl_autoload_register(function($class){
  3. if (file_exists("Interfaces/$class.php")){
  4. include("Interfaces/$class.php");
  5. return;
  6. }
  7. if (file_exists("Model/$class.php")){
  8. include("Model/$class.php");
  9. return;
  10. }
  11. if (file_exists("Database/$class.php"))
  12. include("Database/$class.php");
  13. });
  14. $files=glob("base/*.php");
  15. foreach ($files as $file)
  16. require_once $file;
  17. class Application{
  18. protected $_view, $_controller, $_url, $_dependencyInjector;
  19. private function LoadMethodCallArguments($methodParams,$params){
  20. $callArgs=array();
  21. foreach ($methodParams as $methodParam){
  22. $index=$methodParam->getPosition();
  23. $name=$methodParam->getName();
  24. $type=$methodParam->getClass();
  25. $default=null;
  26. try {
  27. $default=$methodParam->getDefaultValue();
  28. }catch(Exception $e){}
  29. if(isset($params[$name]))
  30. $callArgs[$index]=$params[$name];
  31. elseif (isset($params[$index]))
  32. $callArgs[$index]=$params[$index];
  33. elseif ($type!=null)
  34. $callArgs[$index]=$this->_dependencyInjector->Resolve($type->getName());
  35. else
  36. $callArgs[$index]=$default;
  37. }
  38. return $callArgs;
  39. }
  40. private function SetupController(Controller $controller){
  41. $controller->DependencyInjector=$this->_dependencyInjector;
  42. }
  43. private function LoadController($page) {
  44. $controller=self::FindControllerPath($page);
  45. if ($controller===false) {
  46. $page="E404";
  47. $controller="Controller/E404.php";
  48. //$params=array($this->_url);
  49. http_response_code(404);
  50. }
  51. include_once $controller;
  52. $controllerObject=new $page();
  53. $this->SetupController($controllerObject);
  54. return $controllerObject;
  55. }
  56. private function ActualLoadPage($page,$action,$params){
  57. $this->_controller=$this->LoadController($page);
  58. $controller=get_class($this->_controller);
  59. if (!method_exists($this->_controller, $action))
  60. $action="Index";
  61. $rm=new ReflectionMethod($controller, $action);
  62. $methodParams=$rm->getParameters();
  63. //Old behaviour detection, please seek to remove
  64. if (count($methodParams)==1 && $methodParams[0]->getName()=="params"){
  65. $this->_view=$this->_controller->$action($params);
  66. return;
  67. }
  68. $callArgs=$this->LoadMethodCallArguments($methodParams, $params);
  69. $this->_view=call_user_func_array(array($this->_controller,$action), $callArgs);
  70. }
  71. protected function LoadPage($page,$action,$params){
  72. $this->ActualLoadPage($page, $action ,$params);
  73. }
  74. private function PopulateParamsFromGetPost() {
  75. $params=array();
  76. foreach ($_GET as $key=>$_)
  77. $params[$key]=filter_input(INPUT_GET, $key);
  78. foreach ($_POST as $key=>$_)
  79. if (!is_array($_))
  80. $params[$key]=filter_input(INPUT_POST, $key);
  81. else
  82. $params[$key]=filter_input(INPUT_POST,$key, FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
  83. //$params['cookies']=array();;
  84. //foreach ($_COOKIE as $key=>$_)
  85. // $params['cookies'][$key]=filter_input(INPUT_COOKIE, $key);
  86. return $params;
  87. }
  88. function __construct($url) {
  89. $this->_url=$url;
  90. $this->RegisterDependencies();
  91. $page=ApplicationSettings::GetSetting("general", "default_page");
  92. $action="Index";
  93. $params=array();
  94. $parts=explode("/", $url, 3);
  95. switch (count($parts)){
  96. case 3:
  97. if ($parts[2]!='')
  98. $params=explode("/",$parts[2]);
  99. case 2:
  100. //$action=ucfirst($parts[1]);
  101. $action=$parts[1];
  102. case 1:
  103. if ($parts[0]!="")
  104. $page=$parts[0];
  105. break;
  106. }
  107. $params=array_merge($params,$this->PopulateParamsFromGetPost());
  108. try {
  109. $this->LoadPage($page, $action, $params);
  110. } catch (Exception $e){
  111. Utils::var_dump_email($e);
  112. $this->ActualLoadPage("E500", "Index", array());
  113. http_response_code(500);
  114. }
  115. }
  116. public function GetOutput(){
  117. if (gettype($this->_view)=="object")
  118. return $this->_view->GetHTMLFromTemplate(ApplicationSettings::GetSetting("general", "template"));
  119. switch (gettype($this->_view)){
  120. case "string":
  121. case "integer":
  122. return $this->_view;
  123. }
  124. return "";
  125. }
  126. private function RegisterDependencies() {
  127. $this->_dependencyInjector=new DependencyInjector();
  128. $dependencies=ApplicationSettings::GetSettings("dependencies");
  129. foreach ($dependencies as $key=>$value)
  130. $this->_dependencyInjector->Register($key,$value);
  131. }
  132. public static function FindControllerPath($controller){
  133. $controllerLower=strtolower($controller);
  134. $files=glob("Controller/*.php");
  135. foreach ($files as $file)
  136. if (strtolower(basename($file,".php"))==$controllerLower)
  137. return $file;
  138. return false;
  139. }
  140. }