Префикс маршрута API со значением данных post

#laravel #laravel-8 #laravel-routing

Вопрос:

Возможно ли иметь префикс маршрута динамического API, значение которого основано на organization поле из данных запроса post?

Например, данные запроса post являются:

 id: 1, name: 'John Doe', organization: 'CISCO'
 

Чего я хотел в своем маршруте, так это:

 Route::prefix('CISCO')->group(function() {
    Route::post('create', [Controller::class, 'create'];
})
 

И если это невозможно, есть ли какой-либо другой способ передать organization значение, чтобы я мог структурировать маршрут с динамическим префиксом?

Ответ №1:

В вашем примере CISCO это параметр в вашем URL-адресе.

Вы можете сделать это:

 Route::prefix('{organization}')->group(function() {
    Route::post('create', [Controller::class, 'create'];
});
 

Которая ведет к этому маршруту:

POST http://youdomain.com/CISCO/create

Затем в вашем контроллере:

 public function create($organization)
{
    dd($organization); //CISCO
}
 

Будьте осторожны с подобными префиксами, так как это может привести к проблемам с маршрутизацией. Например, если у вас есть другой маршрут, подобный этому:

 Route::prefix('{organization}')->group(function() {
    Route::post('create', [Controller::class, 'create'];
});

Route::prefix('{shop}')->group(function() {
    Route::post('create', [ShopController::class, 'create'];
});
 

Ларавелю будет трудно понять, какой маршрут он должен использовать.

Хорошей практикой здесь является добавление еще одного префикса, так что это выглядит следующим образом:

 Route::prefix('organization/{organization}')->group(function() {
    Route::post('create', [Controller::class, 'create'];
});

Route::prefix('shop/{shop}')->group(function() {
    Route::post('create', [ShopController::class, 'create'];
});
 

Кроме того, имейте в виду, что использование префиксов полезно, когда у вас есть несколько маршрутов, использующих его. Если у вас есть только один маршрут, вы должны делать только что-то вроде этого:

 
Route::post('organization/{organization}/create', [Controller::class, 'create'];
Route::post('shop/{shop}/create', [ShopController::class, 'create'];

 

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

1. Спасибо @toyi, на данный момент я не могу голосовать из-за моей низкой репутации. приму этот ответ через 4 минуты.

2. Спасибо! Рад, что это решает вашу проблему. Я обновил свой ответ некоторой дополнительной информацией, которая может быть вам полезна. Хорошего вам дня 🙂