#laravel #mod-rewrite #routes
#laravel #переписать мод #маршруты
Вопрос:
Я разрабатываю API. Допустим, у меня есть следующие конечные точки, которые должны выводить одни и те же ресурсы:
- /api/пользователи/5/комментарии
- /api/комментарии?идентификатор пользователя=5
У меня есть контроллер для обработки users
конечной точки, и у меня есть контроллер для обработки comments
конечной точки. Каждый контроллер также обрабатывает всю необходимую фильтрацию, сортировку и т.д.
Поскольку две предоставленные конечные точки должны выводить одни и те же данные, есть ли способ, которым я могу сообщить Laravel об этом в маршрутах? Я не хочу использовать реализацию URL # 2 выше, чтобы также выводить соответствующий ответ для URL # 1.
Я предполагаю, что я ищу что-то похожее на ПЕРЕЗАПИСЬ мода в .htaccess.
Ответ №1:
Разве недостаточно указать на тот же контроллер?
Route::get('/api/users/{userid}/comments', 'CommentController@index');
Route::get('/api/comments', 'CommentController@index');
Затем обработка конкретного случая, если в нем указан идентификатор пользователя.
public function index(Request $request) {
$commentQuery = Comment::query();
$commentQuery->when($request->query->has('user-id'), function ($query) use ($request) {
$query->where('user-id', $request->query->get('user-id'));
});
return $commentQuery->get();
}
Комментарии:
1. Альтернативно, для больших приложений лучше всего было бы поместить бизнес-логику в сервис, подобный class, но тогда вы можете создать два разных контроллера, использующих один и тот же сервис, что является той же идеей.
2. Я перевариваю ваше решение. Что, если бы с ним
comments
былаmedia
связана? Как бороться с/api/users/5/comments/100/media
?3. Или, если
users
мог бы иметьmedia
, что могло бы иметьcomments
, что могло бы иметьmedia
:/api/users/5/media/100/comments/50/media
4. Создавать для них новые контроллеры? контроллеры должны обрабатывать только одну вещь, например. CommentController обрабатывает комментарии, CommentMediaController обрабатывает медиафайлы комментариев и т.д.
5. В итоге я бы получил
UserMediaController
,UserMediaCommentController
UserMediaCommentMediaController
и т.д. Не уверен в этом.