Routing.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?php
  2. namespace ForkBB\Controllers;
  3. use R2\DependencyInjection\ContainerInterface;
  4. class Routing
  5. {
  6. /**
  7. * Контейнер
  8. * @var ContainerInterface
  9. */
  10. protected $c;
  11. /**
  12. * Конструктор
  13. * @param array $config
  14. */
  15. public function __construct(ContainerInterface $container)
  16. {
  17. $this->c = $container;
  18. }
  19. /**
  20. * Маршрутиризация
  21. * @return Page
  22. */
  23. public function routing()
  24. {
  25. $user = $this->c->get('user');
  26. $config = $this->c->get('config');
  27. $r = $this->c->get('Router');
  28. // регистрация/вход/выход
  29. if ($user->isGuest) {
  30. // вход
  31. $r->add('GET', '/login', 'Auth:login', 'Login');
  32. $r->add('POST', '/login', 'Auth:loginPost');
  33. // забыли пароль
  34. $r->add('GET', '/login/forget', 'Auth:forget', 'Forget');
  35. $r->add('POST', '/login/forget', 'Auth:forgetPost');
  36. // смена пароля
  37. $r->add('GET', '/login/{email}/{key}', 'Auth:changePass', 'ChangePassword');
  38. $r->add('POST', '/login/{email}/{key}', 'Auth:changePassPost');
  39. // регистрация
  40. if ($config['o_regs_allow'] == '1') {
  41. $r->add('GET', '/registration', 'Registration:reg', 'Registration'); //????
  42. }
  43. } else {
  44. // выход
  45. $r->add('GET', '/logout/{token}', 'Auth:logout', 'Logout');
  46. }
  47. // просмотр разрешен
  48. if ($user->gReadBoard == '1') {
  49. // главная
  50. $r->add('GET', '/', 'Index:view', 'Index');
  51. // правила
  52. if ($config['o_rules'] == '1' && (! $user->isGuest || $config['o_regs_allow'] == '1')) {
  53. $r->add('GET', '/rules', 'Rules:view', 'Rules');
  54. }
  55. // поиск
  56. if ($user->gSearch == '1') {
  57. $r->add('GET', '/search', 'Search:view', 'Search');
  58. }
  59. // юзеры
  60. if ($user->gViewUsers == '1') {
  61. // список пользователей
  62. $r->add('GET', '/userlist[/page/{page}]', 'Userlist:view', 'Userlist');
  63. // юзеры
  64. $r->add('GET', '/user/{id:\d+}[/{name}]', 'Profile:view', 'User'); //????
  65. }
  66. // разделы
  67. $r->add('GET', '/forum/{id:\d+}[/{name}][/page/{page:\d+}]', 'Forum:view', 'Forum');
  68. // темы
  69. $r->add('GET', '/post/{id:\d+}#p{id}', 'Topic:viewpost', 'viewPost');
  70. }
  71. // админ и модератор
  72. if ($user->isAdmMod) {
  73. $r->add('GET', '/admin/', 'AdminIndex:index', 'Admin');
  74. $r->add('GET', '/admin/statistics', 'AdminStatistics:statistics', 'AdminStatistics');
  75. }
  76. // только админ
  77. if ($user->isAdmin) {
  78. $r->add('GET', '/admin/statistics/info', 'AdminStatistics:info', 'AdminInfo');
  79. }
  80. $uri = $_SERVER['REQUEST_URI'];
  81. if (($pos = strpos($uri, '?')) !== false) {
  82. $uri = substr($uri, 0, $pos);
  83. }
  84. $uri = rawurldecode($uri);
  85. $route = $r->route($_SERVER['REQUEST_METHOD'], $uri);
  86. $page = null;
  87. switch ($route[0]) {
  88. case $r::OK:
  89. // ... 200 OK
  90. list($page, $action) = explode(':', $route[1], 2);
  91. $page = $this->c->get($page)->$action($route[2]);
  92. break;
  93. case $r::NOT_FOUND:
  94. // ... 404 Not Found
  95. if ($user->gReadBoard != '1' && $user->isGuest) {
  96. $page = $this->c->get('Redirect')->setPage('Login');
  97. } else {
  98. // $page = $this->c->get('Message')->message('Bad request');
  99. }
  100. break;
  101. case $r::METHOD_NOT_ALLOWED:
  102. // ... 405 Method Not Allowed
  103. $page = $this->c->get('Message')->message('Bad request', true, 405, ['Allow: ' . implode(',', $route[1])]);
  104. break;
  105. case $r::NOT_IMPLEMENTED:
  106. // ... 501 Not implemented
  107. $page = $this->c->get('Message')->message('Bad request', true, 501);
  108. break;
  109. }
  110. return $page;
  111. }
  112. }