Маршруты Laravel — как «переписать мод»?

#laravel #mod-rewrite #routes

#laravel #переписать мод #маршруты

Вопрос:

Я разрабатываю API. Допустим, у меня есть следующие конечные точки, которые должны выводить одни и те же ресурсы:

  1. /api/пользователи/5/комментарии
  2. /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 и т.д. Не уверен в этом.