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

StalkerClasses

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

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

А также как обрабатывать различный маршрут внутри одного и того же действия?
 
Разве что поиск в разных корневых категориях. У меня бывает часто, что первая часть одинаковая, остальные разные.
 
Например, в браузере в 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');
 
В 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"
}
Мне разбирать не нужно, но как я понимаю, строка легко разбирается.
 
Конечно можно задать несколько URI с несколькими параметрами и передать одному контроллеру в его один метод.
Опять же параметры будут тогда раздельно. То же позволяет делать любой нормальный фреймвок.
 
Конечно можно задать несколько 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 понимаете что дальше сделать.
 
Обычно в $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();
});

Данный пример обходится без контроллера, но так лучше видно.
 
Последнее редактирование:
Сформулирую вопрос по другому - можно утверждать что в 98% случаев:
1 уникальный маршрут (даже с параметрами /*) всегда соответствует 1 уникальному действию?
 
я для 2х разных рут писал бы 2 различных контоллера, хоть даже они полностью друг другу идентичны.
приведи пример когда необходимо совершенно различные руты но одинаковое действие
 
приведи пример когда необходимо совершенно различные руты но одинаковое действие
Я понимаю, что вопрос не ко мне, но уже назвал одну точно существующую ситуацию. Это нужно для поддержки роутинга одностраничного приложения. Нет смысла рулить страницей 404 и на сервере и в одностраничнике.
 
Сформулирую вопрос по другому - можно утверждать что в 98% случаев:
1 уникальный маршрут (даже с параметрами /*) всегда соответствует 1 уникальному действию?
Смысл маршрута в определении уникального ресурса и одного действия над ним.
 
В одностраничнике на том же Vue? В Vue router - это специфический роут.

Прописывать все роуты для SPA на бекэнде и ловить на нём 404 нет смысла. Достаточно только прописать роуты API обращений к бекэнду и всё остальное отдавать загрузчику SPA. SPA пусть ловит то, чего у него нет на уровне браузера.
 
Последнее редактирование:
backend вернет на незнакомый uri просто код 404, даже с html-body, клиент просто рендит 404-view. Где ты увидел руту?
 
я для 2х разных рут писал бы 2 различных контоллера, хоть даже они полностью друг другу идентичны.
приведи пример когда необходимо совершенно различные руты но одинаковое действие
Было интересно увидеть такие примеры.
Получается что 1 маршрут = одно действие (по крайней мере это 98% всех случаев).
 
Зависит от того, как именно определять "маршрут" и"действие".
Но в общем случае, да.
 
Сверху