/libs_php/route.php

https://bitbucket.org/posportteam/dream · PHP · 136 lines · 99 code · 18 blank · 19 comment · 12 complexity · 15b9dcbc196a648aa09ae8c1f901a5a7 MD5 · raw file

  1. <?
  2. /*
  3. Класс-маршрутизатор для определения запрашиваемой страницы.
  4. цепляет классы контроллеров и моделей;
  5. создает экземпляры контролеров страниц и вызывает действия этих контроллеров.
  6. */
  7. class Route{
  8. static function start(){
  9. // контроллер и действие по умолчанию
  10. $action_param = array();
  11. $action_name = 'index';
  12. // Разбиваем имя запроса в массив
  13. $routes = explode('/', $_SERVER['REQUEST_URI']);
  14. // получаем имя контроллера
  15. if (!empty($routes[1])){
  16. if(file_exists('./controllers/controller_'.strtolower($routes[1]).'.php')){ // Проверка контроллера
  17. $controller_name = $routes[1];
  18. }else{
  19. $pat_user = "/user\d{1,7}/i";
  20. $pat_id = "/id\d{1,7}/i";
  21. $pat_club = "/club\d{1,7}/i";
  22. $pat_org = "/org\d{1,7}/i";
  23. $pat_gal = "/gallery\d{1,10}/i";
  24. $pat_alb = "/album\d{1,10}/i";
  25. $pat_sor = "/sor\d{1,10}/i";
  26. $pat_art = "/article\d{1,7}/i";
  27. $pat_group = "/group\d{1,5}/i";
  28. if(preg_match($pat_id,$routes[1],$maches)){ //проверка по ID????
  29. $controller_name = 'users';
  30. $action_param = array('id_user'=>substr($routes[1],2));
  31. }elseif(preg_match($pat_user,$routes[1],$maches)){ //проверка по ID????
  32. $controller_name = 'users';
  33. $action_param = array('id_user'=>substr($routes[1],4));
  34. }elseif(preg_match($pat_group,$routes[1],$maches)){ //проверка по ID????
  35. $controller_name = 'groups';
  36. $action_param = array('id_group'=>substr($routes[1],5));
  37. }elseif(preg_match($pat_org,$routes[1],$maches)){
  38. $controller_name = 'org';
  39. $action_param = array('id_org'=>substr($routes[1],3));
  40. }elseif(preg_match($pat_sor,$routes[1],$maches)){
  41. $controller_name = 'sor';
  42. $action_name = 'view';
  43. $action_param = array('id_sor'=>substr($routes[1],3));
  44. }elseif(preg_match($pat_club,$routes[1],$maches)){
  45. $controller_name = 'club';
  46. $action_param = array('id_club'=>substr($routes[1],4));
  47. }elseif(preg_match($pat_art,$routes[1],$maches)){
  48. $controller_name = 'articles';
  49. $action_name = 'view';
  50. $action_param = array('id_art'=>substr($routes[1],7));
  51. }elseif(preg_match($pat_alb,$routes[1],$maches)){
  52. $controller_name = 'photo';
  53. $action_name = 'album';
  54. $action_param = array('id_photo'=>substr($routes[1],5));
  55. }elseif(preg_match($pat_gal,$routes[1],$maches)){
  56. $controller_name = 'photo';
  57. $action_param = array('id_photo'=>substr($routes[1],7));
  58. }else{
  59. $nick_q = ("SELECT id,controller FROM nicks WHERE nick='$routes[1]' LIMIT 1");
  60. $nick_r = mysql_query($nick_q);
  61. $nick = mysql_fetch_array($nick_r);
  62. if($nick['id'] && $nick['controller']){ // Проверка по нику
  63. $controller_name = $nick['controller'];
  64. $action_param = array('id'=>$nick['id']);
  65. };
  66. };
  67. };
  68. }else{
  69. $controller_name = 'index';
  70. };
  71. // получаем имя экшена
  72. if (!empty($routes[2]) || !$action_name){
  73. $action = explode('?',$routes[2]);
  74. if (!empty($action[0])){
  75. $action_name = $action[0];
  76. };
  77. if (!empty($action[1])){
  78. parse_str($action[1],$action_param);
  79. };
  80. }
  81. // добавляем префиксы
  82. $model_name = 'model_'.$controller_name;
  83. $controller_name = 'controller_'.$controller_name;
  84. $action_name = 'action_'.$action_name;
  85. $controller_path = "./controllers/".strtolower($controller_name).'.php';
  86. //echo "<br><br><br>$controller_path";
  87. if(file_exists($controller_path)){
  88. // подцепляем файл с классом модели (файла модели может и не быть)
  89. $model_file = strtolower($model_name).'.php';
  90. $model_path = "./models/".$model_file;
  91. if(file_exists($model_path)){
  92. include "./models/".$model_file;
  93. }
  94. include $controller_path;
  95. // создаем контроллер
  96. $controller = new $controller_name;
  97. if(method_exists($controller, $action_name)){
  98. // вызываем действие контроллера с параметрами
  99. $controller->$action_name($action_param);
  100. }else{
  101. // здесь также разумнее было бы кинуть исключение
  102. Route::ErrorPage404();
  103. }
  104. }else{
  105. /*
  106. правильно было бы кинуть здесь исключение,
  107. но для упрощения сразу сделаем редирект на страницу 404
  108. */
  109. Route::ErrorPage404();
  110. }
  111. }
  112. function ErrorPage404(){
  113. $host = 'http://'.$_SERVER['HTTP_HOST'].'/';
  114. header('HTTP/1.1 404 Not Found');
  115. header("Status: 404 Not Found");
  116. header('Location:'.$host.'404');
  117. }
  118. };