Пример - два и более маршрутов с отсылкой к 1 контроллеру и 1 действию

StalkerClasses

Новичок
Можно пожалуйста привести один или несколько примеров из практики когда разные маршруты с разным набором параметров требуют обращения к одинаковому 1 контроллеру и одинаковому 1 действию.

/маршрут1/параметры/ -> controllerA->actionOne()
/маршрут2/параметры/параметры/ -> controllerA->actionOne()
/маршрут3/ -> controllerA->actionOne()

А также как обрабатывать различный маршрут внутри одного и того же действия?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Разве что поиск в разных корневых категориях. У меня бывает часто, что первая часть одинаковая, остальные разные.
 

jonjonson

Охренеть
Например, в браузере в Vue используется маршрутизация с mode: 'history'
При этом нужно что бы можно было набрать любой браузерный маршрут ручками, а не начинать всегда с одного.
Но кроме того могут быть роуты для серверного API.
Вот и прописываем отдельный роуты для API, а за ними один или несколько роутов для браузерного приложения на один контроллер и метод. На бекэнде обработка минимальная, которой до одного места всё многообразие роутов, главное поднять браузерное приложение. Но при этом, извращенцы могут воспользоваться параметрами роута для своих махинаций.

PHP:
// slim 3.x ...
$app->get(
    '/api/v1/screens',
    \App\Controllers\Api\ScreensController::class . ':getList'
);
$app->post(
    '/api/v1/screens/create',
    \App\Controllers\Api\ScreensController::class . ':create'
);
//...

$app->get('[/{params:.*}]', \App\Controllers\VueController::class . ':index');
 

jonjonson

Охренеть
В slim 3 приходит третий аргумент с параметрами URI, если они определены. В данном случае просто весь URI.
PHP:
$app->get('[/{params:.*}]', function ($request, $response, $args) {
    dd($args);
});
Для http://192.168.99.100:8080/fo/bar/baz
array(1) {
["params"]=>
string(10) "fo/bar/baz"
}
Мне разбирать не нужно, но как я понимаю, строка легко разбирается.
 

jonjonson

Охренеть
Конечно можно задать несколько URI с несколькими параметрами и передать одному контроллеру в его один метод.
Опять же параметры будут тогда раздельно. То же позволяет делать любой нормальный фреймвок.
 

StalkerClasses

Новичок
Конечно можно задать несколько URI с несколькими параметрами и передать одному контроллеру в его один метод.
Опять же параметры будут тогда раздельно. То же позволяет делать любой нормальный фреймвок.
PHP:
class HomeController
{
   public function home($request, $response, $args) {
        // your code
        // to access items in the container... $this->container->get('');
        return $response;
   }

   public function contact($request, $response, $args) {
        // your code
        // to access items in the container... $this->container->get('');
        return $response;
   }
}
Получается что вы разбираете уже внутри действия массив $args и грубо говоря через if понимаете что дальше сделать.
 

jonjonson

Охренеть
Обычно в $args помещают идентификаторы и нечто подобное.
И да, на основе идентификатора я могу получить объект бизнес логики или объект объекта бизнес логики.
Например: http://192.168.99.100:8080/foo/42/bar/13/remove

Код:
$app->delete('/foo/{foo}/bar/{bar}/remove', function ($request, $response, $args) use ($container) {
  
    $service = $container->get('RemoveBarService')
    $result = $service->execute($args['foo'], $args['bar']);
  
    return $result->on('Success', function ($result) use ($response) {
        $data = [
            'confirm' => 'bar removed',
        ];
        return $response->withJson($data);
    })->on('Error', function ($result) use ($response) {
        $exception = $result->get('error');
        $data = ['error' => $exception->getMessage()];
        return $response->withJson($data);
    })->render();
});
Данный пример обходится без контроллера, но так лучше видно.
 
Последнее редактирование:

StalkerClasses

Новичок
Сформулирую вопрос по другому - можно утверждать что в 98% случаев:
1 уникальный маршрут (даже с параметрами /*) всегда соответствует 1 уникальному действию?
 

WMix

герр M:)ller
Партнер клуба
я для 2х разных рут писал бы 2 различных контоллера, хоть даже они полностью друг другу идентичны.
приведи пример когда необходимо совершенно различные руты но одинаковое действие
 

jonjonson

Охренеть
приведи пример когда необходимо совершенно различные руты но одинаковое действие
Я понимаю, что вопрос не ко мне, но уже назвал одну точно существующую ситуацию. Это нужно для поддержки роутинга одностраничного приложения. Нет смысла рулить страницей 404 и на сервере и в одностраничнике.
 

jonjonson

Охренеть
Сформулирую вопрос по другому - можно утверждать что в 98% случаев:
1 уникальный маршрут (даже с параметрами /*) всегда соответствует 1 уникальному действию?
Смысл маршрута в определении уникального ресурса и одного действия над ним.
 

jonjonson

Охренеть
В одностраничнике на том же Vue? В Vue router - это специфический роут.

Прописывать все роуты для SPA на бекэнде и ловить на нём 404 нет смысла. Достаточно только прописать роуты API обращений к бекэнду и всё остальное отдавать загрузчику SPA. SPA пусть ловит то, чего у него нет на уровне браузера.
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
backend вернет на незнакомый uri просто код 404, даже с html-body, клиент просто рендит 404-view. Где ты увидел руту?
 

StalkerClasses

Новичок
я для 2х разных рут писал бы 2 различных контоллера, хоть даже они полностью друг другу идентичны.
приведи пример когда необходимо совершенно различные руты но одинаковое действие
Было интересно увидеть такие примеры.
Получается что 1 маршрут = одно действие (по крайней мере это 98% всех случаев).
 

AnrDaemon

Продвинутый новичок
Зависит от того, как именно определять "маршрут" и"действие".
Но в общем случае, да.
 
Сверху