За последние 24 часа нас посетили 8752 программиста и 1062 робота. Сейчас ищут 386 программистов ...

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

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

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

    [ БАН ]

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

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

    [ БАН ]

    С нами с:
    19 июн 2017
    Сообщения:
    573
    Симпатии:
    19
    интересный фокус, суть понял, осталось допетрить как создать общий роут с проверкой авторизации для списка роутов, прописанных после него :) , чтобы он перекрывал список роутов
    --- Добавлено ---
    @[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