Как вы можете создавать маршруты с подстановочными знаками в Lumen?

#php #laravel #routes #lumen #fastroute

Вопрос:

Допустим, у меня есть контроллер под названием TeamsController. Контроллер имеет следующий метод, который возвращает все команды, к которым пользователь имеет доступ.

 public function findAll(Request $request): JsonResponse
{
  //...
}
 

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

Я не могу поймать имя контроллера из URI. Это то, что я пробовал.

 $router->group(['middleware' => 'jwt.auth'], function () use ($router) {
    // This works
    //$router->get('teams', 'TeamsController@findAll');
    
    // This just returns TeamsController@findAll string as a response
    $router->get('{resource}', function ($resource) {
        return ucfirst($resource) . 'Controller@findAll';
    });
});
 

Комментарии:

1. Во-первых, это звучит как плохая идея. Маршруты хранятся (и должны храниться) в кэше, поэтому я не уверен, что это сработает. Ваш код возвращает строку, поэтому вполне нормально, что он показывает строку в качестве ответа. функция контроллера никогда не вызывается.

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

3. @GertB. Таким образом, они не будут кэшироваться при использовании замыканий? Это было то, о чем я тоже думал. Я думаю, тогда лучше перечислить все маршруты. Это первый проект Lumen / Laravel в нашей компании, так что только начинаем. Спасибо.

Ответ №1:

Вы возвращаете строку вместо вызова действия контроллера: я считаю, что Laravel загружает контроллеры таким образом (не тестировался)

 $router->group(['middleware' => 'jwt.auth'], function () use ($router) {
  $router->get('{resource}', function ($resource) {
    $app = app();
    $controller = $app->make('AppHttpControllers'. ucfirst($resource) . 'Controller');
    return $controller->callAction('findAll', $parameters = array());
 });
});
 

Но опять же, я не думаю, что это хорошая идея.