Routing.php 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <?php
  2. namespace ForkBB\Controllers;
  3. use ForkBB\Core\Container;
  4. class Routing
  5. {
  6. /**
  7. * Контейнер
  8. * @var Container
  9. */
  10. protected $c;
  11. /**
  12. * Конструктор
  13. *
  14. * @param Container $container
  15. */
  16. public function __construct(Container $container)
  17. {
  18. $this->c = $container;
  19. }
  20. /**
  21. * Маршрутиризация
  22. *
  23. * @return Page
  24. */
  25. public function routing()
  26. {
  27. $user = $this->c->user;
  28. $config = $this->c->config;
  29. $r = $this->c->Router;
  30. // регистрация/вход/выход
  31. if ($user->isGuest) {
  32. // вход
  33. $r->add(['GET', 'POST'], '/login', 'Auth:login', 'Login');
  34. // забыли кодовую фразу
  35. $r->add(['GET', 'POST'], '/login/forget', 'Auth:forget', 'Forget');
  36. // смена кодовой фразы
  37. $r->add(['GET', 'POST'], '/login/{email}/{key}/{hash}', 'Auth:changePass', 'ChangePassword');
  38. // регистрация
  39. if ('1' == $config->o_regs_allow) {
  40. $r->add('GET', '/registration', 'Rules:confirmation', 'Register');
  41. $r->add('POST', '/registration/agree', 'Register:reg', 'RegisterForm');
  42. $r->add('GET', '/registration/activate/{id:\d+}/{key}/{hash}', 'Register:activate', 'RegActivate');
  43. }
  44. } else {
  45. // выход
  46. $r->add('GET', '/logout/{token}', 'Auth:logout', 'Logout');
  47. // обработка "кривых" перенаправлений с логина и регистрации
  48. $r->add('GET', '/login[/{tail:.*}]', 'Redirect:toIndex');
  49. $r->add('GET', '/registration[/{tail:.*}]', 'Redirect:toIndex');
  50. }
  51. // просмотр разрешен
  52. if ('1' == $user->g_read_board) {
  53. // главная
  54. $r->add('GET', '/', 'Index:view', 'Index');
  55. // правила
  56. if ('1' == $config->o_rules && (! $user->isGuest || '1' == $config->o_regs_allow)) {
  57. $r->add('GET', '/rules', 'Rules:view', 'Rules');
  58. }
  59. // поиск
  60. if ('1' == $user->g_search) {
  61. $r->add('GET', '/search[/simple/{keywords}[/{page:[1-9]\d*}]]', 'Search:view', 'Search');
  62. $r->add('POST', '/search', 'Search:view');
  63. $r->add('GET', '/search/advanced[/{keywords}/{author}/{forums}/{serch_in:\d}/{sort_by:\d}/{sort_dir:\d}/{show_as:\d}[/{page:[1-9]\d*}]]', 'Search:viewAdvanced', 'SearchAdvanced');
  64. $r->add('POST', '/search/advanced', 'Search:viewAdvanced');
  65. $r->add('GET', '/search/{action:(?!search)\w+}[/{page:[1-9]\d*}]', 'Search:action', 'SearchAction');
  66. }
  67. // юзеры
  68. if ($user->viewUsers) {
  69. // список пользователей
  70. $r->add('GET', '/userlist[/{sort:username|registered|num_posts}/{dir:ASC|DESC}/{group:\-1|[1-9]\d*}/{name}][/{page:[1-9]\d*}]', 'Userlist:view', 'Userlist');
  71. $r->add('POST', '/userlist', 'Userlist:view');
  72. // юзеры
  73. $r->add('GET', '/user/{id:[2-9]|[1-9]\d+}/{name}', 'Profile:view', 'User');
  74. $r->add(['GET', 'POST'], '/user/{id:[2-9]|[1-9]\d+}/edit/profile', 'Profile:edit', 'EditUserProfile');
  75. $r->add(['GET', 'POST'], '/user/{id:[2-9]|[1-9]\d+}/edit/config', 'Profile:config', 'EditBoardConfig');
  76. $r->add(['GET', 'POST'], '/user/{id:[2-9]|[1-9]\d+}/change/email', 'Profile:email', 'ChangeUserEmail');
  77. } elseif (! $user->isGuest) {
  78. // только свой профиль
  79. $r->add('GET', '/user/{id:' . $user->id . '}/{name}', 'Profile:view', 'User');
  80. $r->add(['GET', 'POST'], '/user/{id:' . $user->id . '}/edit/profile', 'Profile:edit', 'EditUserProfile');
  81. $r->add(['GET', 'POST'], '/user/{id:' . $user->id . '}/edit/config', 'Profile:config', 'EditBoardConfig');
  82. $r->add(['GET', 'POST'], '/user/{id:' . $user->id . '}/change/email', 'Profile:email', 'ChangeUserEmail');
  83. }
  84. // пометка разделов прочитанными
  85. if (! $user->isGuest) {
  86. $r->add('GET', '/forum/{id:\d+}/markread/{token}', 'Misc:markread', 'MarkRead');
  87. }
  88. // разделы
  89. $r->add('GET', '/forum/{id:[1-9]\d*}/{name}[/{page:[1-9]\d*}]', 'Forum:view', 'Forum' );
  90. $r->add(['GET', 'POST'], '/forum/{id:[1-9]\d*}/new/topic', 'Post:newTopic', 'NewTopic');
  91. // темы
  92. $r->add('GET', '/topic/{id:[1-9]\d*}/{name}[/{page:[1-9]\d*}]', 'Topic:viewTopic', 'Topic' );
  93. $r->add('GET', '/topic/{id:[1-9]\d*}/view/new', 'Topic:viewNew', 'TopicViewNew' );
  94. $r->add('GET', '/topic/{id:[1-9]\d*}/view/unread', 'Topic:viewUnread', 'TopicViewUnread');
  95. $r->add('GET', '/topic/{id:[1-9]\d*}/view/last', 'Topic:viewLast', 'TopicViewLast' );
  96. $r->add('GET', '/topic/{id:[1-9]\d*}/new/reply[/{quote:[1-9]\d*}]', 'Post:newReply', 'NewReply' );
  97. $r->add('POST', '/topic/{id:[1-9]\d*}/new/reply', 'Post:newReply' );
  98. // сообщения
  99. $r->add('GET', '/post/{id:[1-9]\d*}#p{id}', 'Topic:viewPost', 'ViewPost' );
  100. $r->add(['GET', 'POST'], '/post/{id:[1-9]\d*}/edit', 'Edit:edit', 'EditPost' );
  101. $r->add(['GET', 'POST'], '/post/{id:[1-9]\d*}/delete', 'Delete:delete', 'DeletePost');
  102. $r->add('GET', '/post/{id:[1-9]\d*}/report', 'Report:report', 'ReportPost');
  103. }
  104. // админ и модератор
  105. if ($user->isAdmMod) {
  106. $r->add('GET', '/admin/', 'AdminIndex:index', 'Admin');
  107. $r->add('GET', '/admin/statistics', 'AdminStatistics:statistics', 'AdminStatistics');
  108. }
  109. // только админ
  110. if ($user->isAdmin) {
  111. $r->add('GET', '/admin/statistics/info', 'AdminStatistics:info', 'AdminInfo' );
  112. $r->add(['GET', 'POST'], '/admin/options', 'AdminOptions:edit', 'AdminOptions' );
  113. $r->add(['GET', 'POST'], '/admin/permissions', 'AdminPermissions:edit', 'AdminPermissions' );
  114. $r->add(['GET', 'POST'], '/admin/categories', 'AdminCategories:view', 'AdminCategories' );
  115. $r->add(['GET', 'POST'], '/admin/categories/{id:[1-9]\d*}/delete', 'AdminCategories:delete', 'AdminCategoriesDelete');
  116. $r->add(['GET', 'POST'], '/admin/forums', 'AdminForums:view', 'AdminForums' );
  117. $r->add(['GET', 'POST'], '/admin/forums/new', 'AdminForums:edit', 'AdminForumsNew' );
  118. $r->add(['GET', 'POST'], '/admin/forums/{id:[1-9]\d*}/edit', 'AdminForums:edit', 'AdminForumsEdit' );
  119. $r->add(['GET', 'POST'], '/admin/forums/{id:[1-9]\d*}/delete', 'AdminForums:delete', 'AdminForumsDelete' );
  120. $r->add('GET', '/admin/groups', 'AdminGroups:view', 'AdminGroups' );
  121. $r->add('POST', '/admin/groups/default', 'AdminGroups:defaultSet', 'AdminGroupsDefault');
  122. $r->add('POST', '/admin/groups/new[/{base:[1-9]\d*}]', 'AdminGroups:edit', 'AdminGroupsNew' );
  123. $r->add(['GET', 'POST'], '/admin/groups/{id:[1-9]\d*}/edit', 'AdminGroups:edit', 'AdminGroupsEdit' );
  124. $r->add(['GET', 'POST'], '/admin/groups/{id:[1-9]\d*}/delete', 'AdminGroups:delete', 'AdminGroupsDelete' );
  125. $r->add(['GET', 'POST'], '/admin/censoring', 'AdminCensoring:edit', 'AdminCensoring' );
  126. $r->add(['GET', 'POST'], '/admin/maintenance', 'AdminMaintenance:view', 'AdminMaintenance' );
  127. $r->add('POST', '/admin/maintenance/rebuild', 'AdminMaintenance:rebuild', 'AdminMaintenanceRebuild');
  128. $r->add('GET', '/admin/maintenance/rebuild/{token}/{clear:[01]}/{limit:[1-9]\d*}/{start:[1-9]\d*}', 'AdminMaintenance:rebuild', 'AdminRebuildIndex' );
  129. }
  130. $uri = $_SERVER['REQUEST_URI'];
  131. if (($pos = \strpos($uri, '?')) !== false) {
  132. $uri = \substr($uri, 0, $pos);
  133. }
  134. $uri = \rawurldecode($uri);
  135. $method = $_SERVER['REQUEST_METHOD'];
  136. $route = $r->route($method, $uri);
  137. $page = null;
  138. switch ($route[0]) {
  139. case $r::OK:
  140. // ... 200 OK
  141. list($page, $action) = \explode(':', $route[1], 2);
  142. $page = $this->c->$page->$action($route[2], $method);
  143. break;
  144. case $r::NOT_FOUND:
  145. // ... 404 Not Found
  146. if ($user->g_read_board != '1' && $user->isGuest) {
  147. $page = $this->c->Redirect->page('Login');
  148. } else {
  149. $page = $this->c->Message->message('Bad request');
  150. }
  151. break;
  152. case $r::METHOD_NOT_ALLOWED:
  153. // ... 405 Method Not Allowed
  154. $page = $this->c->Message->message('Bad request', true, 405, ['Allow: ' . \implode(',', $route[1])]);
  155. break;
  156. case $r::NOT_IMPLEMENTED:
  157. // ... 501 Not implemented
  158. $page = $this->c->Message->message('Bad request', true, 501);
  159. break;
  160. }
  161. return $page;
  162. }
  163. }