За последние 24 часа нас посетили 22774 программиста и 1217 роботов. Сейчас ищут 739 программистов ...

Группировка роутов

Тема в разделе "PHP для новичков", создана пользователем Вероломство, 28 авг 2022.

  1. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    добавляем роут

    PHP:
    1. // сам метод
    2. public function get($pattern, $handler)
    3. {
    4.     $this->router->addRoute($pattern, $handler, ['GET']);
    5. }
    6.  
    7. // где-то там добавили
    8. $application->get('/', HomeAction::class);
    получили данные текущего роута и запустили

    PHP:
    1. //
    2. public function run()
    3. {
    4.     $result = $this->router->matchRoutes($this->request); // return new Result(...)
    5.  
    6.     call_user_func_array(self::$container->get($result->getHandler()), $result->getParameters());
    7. }
    8.  
    9. // запуск
    10. $application->run();
    А как мне организовать теперь группировку роутов, чтобы ну там, например, потом где-то в промежуточном осуществлять редирект-контроль авторизованного.

    Есть мысль, что нужно ну например создать группы и проверять, если группа не для авторизованного, то редиректить на домашнюю для неавторизованного, но не очень понятно, как это сделать, где хранить имя группы, где хранить текущие данные полученного роута соответствующей группы, чтобы производить с ними действия контроля?

    Может кто-то на пальцах пояснит?

    Пока что есть идея задавать имя группы при создании роута, но не очень понятно, после получения $result, что делать дальше с именем группы? Где его хранить, чтобы использовать его в промежуточном сервисе?

    Пропускать Result через контейнер?
     
    #1 Вероломство, 28 авг 2022
    Последнее редактирование: 28 авг 2022
  2. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Группа не обязательно нужна. Вместо группы, вешаешь на один роут больше одного экшена.
    Код (Text):
    1. $application->get('/admin', Guard::class)
    2. $application->get('/admin', AdminAction::class);
    Сначала выполнится Guard. Если пользователь не авторизован, Guard абортнет запрос с кодом 403 и редиректом.
     
    Вероломство нравится это.
  3. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    интересный фокус, суть понял, осталось допетрить как создать общий роут с проверкой авторизации для списка роутов, прописанных после него :) , чтобы он перекрывал список роутов
    --- Добавлено ---
    @[vs] а то я грешным делом вот так наговнокодил

    PHP:
    1. $result = $this->router->matchRoutes($this->request);
    2.  
    3. if ($result->getGroup()) {
    4.     call_user_func(self::$container->get(self::$container->get('settings')['group'][$result->getGroup()]));
    5. }
    6.  
    7. call_user_func_array(self::$container->get($result->getHandler()), $result->getParameters());
    конфиг

    PHP:
    1. use application\support\RedirectToAuth;
    2. use application\support\RedirectToGuest;
    3.  
    4. $container->set('settings', function () {
    5.     return [
    6.         'group' => [
    7.             'guest' => RedirectToAuth::class,
    8.             'auth' => RedirectToGuest::class
    9.         ]
    10.     ];
    11. });
    ну и роуты примерно так

    PHP:
    1. $application->group('guest')
    2.     ->get('/', HomeAction::class)
    3.     ->get('/signin', SigninAction::class);
    4.  
    5. $application->group('auth')
    6.     ->get('/menu', MenuAction::class);
     
    #3 Вероломство, 28 авг 2022
    Последнее редактирование: 28 авг 2022