123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- <?php
- namespace ForkBB\Controllers;
- use R2\DependencyInjection\ContainerInterface;
- class Routing
- {
- /**
- * Контейнер
- * @var ContainerInterface
- */
- protected $c;
- /**
- * Конструктор
- * @param array $config
- */
- public function __construct(ContainerInterface $container)
- {
- $this->c = $container;
- }
- /**
- * Маршрутиризация
- * @return Page
- */
- public function routing()
- {
- $user = $this->c->get('user');
- $config = $this->c->get('config');
- $r = $this->c->get('Router');
- // регистрация/вход/выход
- if ($user->isGuest) {
- // вход
- $r->add('GET', '/login', 'Auth:login', 'Login');
- $r->add('POST', '/login', 'Auth:loginPost');
- // забыли пароль
- $r->add('GET', '/login/forget', 'Auth:forget', 'Forget');
- $r->add('POST', '/login/forget', 'Auth:forgetPost');
- // смена пароля
- $r->add('GET', '/login/{email}/{key}', 'Auth:changePass', 'ChangePassword');
- $r->add('POST', '/login/{email}/{key}', 'Auth:changePassPost');
- // регистрация
- if ($config['o_regs_allow'] == '1') {
- $r->add('GET', '/registration', 'Registration:reg', 'Registration'); //????
- }
- } else {
- // выход
- $r->add('GET', '/logout/{token}', 'Auth:logout', 'Logout');
- }
- // просмотр разрешен
- if ($user->gReadBoard == '1') {
- // главная
- $r->add('GET', '/', 'Index:view', 'Index');
- // правила
- if ($config['o_rules'] == '1' && (! $user->isGuest || $config['o_regs_allow'] == '1')) {
- $r->add('GET', '/rules', 'Rules:view', 'Rules');
- }
- // поиск
- if ($user->gSearch == '1') {
- $r->add('GET', '/search', 'Search:view', 'Search');
- }
- // юзеры
- if ($user->gViewUsers == '1') {
- // список пользователей
- $r->add('GET', '/userlist[/page/{page}]', 'Userlist:view', 'Userlist');
- // юзеры
- $r->add('GET', '/user/{id:\d+}[/{name}]', 'Profile:view', 'User'); //????
- }
- // разделы
- $r->add('GET', '/forum/{id:\d+}[/{name}][/page/{page:\d+}]', 'Forum:view', 'Forum');
- // темы
- $r->add('GET', '/post/{id:\d+}#p{id}', 'Topic:viewpost', 'viewPost');
- }
- // админ и модератор
- if ($user->isAdmMod) {
- $r->add('GET', '/admin/', 'AdminIndex:index', 'Admin');
- $r->add('GET', '/admin/statistics', 'AdminStatistics:statistics', 'AdminStatistics');
- }
- // только админ
- if ($user->isAdmin) {
- $r->add('GET', '/admin/statistics/info', 'AdminStatistics:info', 'AdminInfo');
- }
- $uri = $_SERVER['REQUEST_URI'];
- if (($pos = strpos($uri, '?')) !== false) {
- $uri = substr($uri, 0, $pos);
- }
- $uri = rawurldecode($uri);
- $route = $r->route($_SERVER['REQUEST_METHOD'], $uri);
- $page = null;
- switch ($route[0]) {
- case $r::OK:
- // ... 200 OK
- list($page, $action) = explode(':', $route[1], 2);
- $page = $this->c->get($page)->$action($route[2]);
- break;
- case $r::NOT_FOUND:
- // ... 404 Not Found
- if ($user->gReadBoard != '1' && $user->isGuest) {
- $page = $this->c->get('Redirect')->setPage('Login');
- } else {
- // $page = $this->c->get('Message')->message('Bad request');
- }
- break;
- case $r::METHOD_NOT_ALLOWED:
- // ... 405 Method Not Allowed
- $page = $this->c->get('Message')->message('Bad request', true, 405, ['Allow: ' . implode(',', $route[1])]);
- break;
- case $r::NOT_IMPLEMENTED:
- // ... 501 Not implemented
- $page = $this->c->get('Message')->message('Bad request', true, 501);
- break;
- }
- return $page;
- }
- }
|