Маршрут редактирования Laravel 9 с параметром {id} возвращает Not Found (404), несмотря на то, что он определен

Ниже приведен пример определения маршрута в моем файле route/web.php.

      <?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\WidgetController;

Route::controller(WidgetController::class)->name('widgets.')->prefix('widgets')->group(function () {
  Route::get('{id}/{slug}', 'show')->name('show');
  Route::get('create', 'create')->name('create')->middleware('auth');
  Route::post('store', 'store')->name('store')->middleware('auth');
  Route::get('{id}/edit', 'edit')->name('edit')->middleware('auth');
  Route::post('update', 'update')->name('update')->middleware('auth');
});

Все перечисленные маршруты работают нормально, кроме одного.

      Route::get('{id}/edit', 'edit')->name('edit')->middleware('auth');

По какой-то причине он отлично работает, когда он написан так:

      Route::get('{id}', 'edit')->name('edit')->middleware('auth');

или это:

      Route::get('{id}//edit', 'edit')->name('edit')->middleware('auth');

С «Route::resource» по умолчанию будет первый «редактируемый» маршрут. Однако я получаю 404 при таком определении. Мой связанный метод контроллера написан так:

      public function edit($id)
{
   // Rest of code here
}

Может быть, Laravel ошибочно принимает «редактировать» за второй параметр? Но это не имеет особого смысла, учитывая, что это значение по умолчанию для метода ресурса.

1 ответ

Попробуйте поставить

Route::get('{id}/edit', 'edit')->имя

Выше

Route::get('{id}/{slug}'

Поскольку {slug} может быть чем угодно, скорее всего, он будет выполнен первым. Я бы предложил поставить это в последнюю очередь.

Другие вопросы по тегам