#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());
});
});
Но опять же, я не думаю, что это хорошая идея.