Laravel возвращает 404 по маршруту редактирования (Laravel 6.11.0) - PullRequest
0 голосов
/ 27 января 2020

Я создал следующий маршрут.

Route::resource('admin/products/', 'ProductsController')->middleware('auth');

Я использовал Artisan для создания контроллера со всеми методами (индекс, создание, редактирование и т. Д. c).

Когда я использую команду php ремесленный маршрут: список , я получаю следующие маршруты (среди прочих):

GET|HEAD | admin/products/{}/edit | edit | App\Http\Controllers\ProductsController@edit | web,auth|
DELETE | admin/products/{} | destroy| App\Http\Controllers\ProductsController@destroy| web,auth|

Что и следовало ожидать. Но когда я добавляю {{ route('edit', $product->id) }} к ссылке href, ссылка генерируется правильно, но когда я нажимаю на нее, я получаю страницу 404. То же самое происходит, когда я использую форму для публикации, чтобы уничтожить (я создал форму с action="{{ route('destroy', $product->id) }}" и @method('DELETE'), и я все еще получаю 404.

Любая помощь, где я должен начать искать решение, будет оценил.

Ответы [ 2 ]

2 голосов
/ 27 января 2020

В вашем коде

GET|HEAD  | admin/products/{}/edit

{} должно быть заполнено значением, например, {item}

Если в вашем методе контроллера ProductsController@edit у вас есть код, подобный

public function edit(Request $request, Item $item){
}

второй аргумент Item $item должен 1) существовать, 2) соответствовать значению, которое вы имеете в вашем маршруте {variable} , поэтому, если у вас {item} переменная в аргументе метода должно быть item, если это {something}, тогда оно должно быть public function edit(Request $request, Item $something);...

Обратите внимание, что Request $ request, не требуется в методе;

Я хотел бы добавить, что при этом Item $item приведет к 404, если элемент не найден, элемент будет выбран на основе метода getRouteKeyName() в модели этого элемента, поэтому, если у вас есть в Item model что-то вроде

public function getRouteKeyName()
    {
        return 'slug';
    }

Элемент будет выбран столбцом slug из базы данных. Опять же, если у вас нет этого метода, он будет использовать идентификатор.

Итак, чтобы подвести итог, web должно иметь {some_value}, совпадающее с аргументом вашего контроллера этой модели Product $some_value, где some_value по умолчанию является идентификатором модели Продукта, если вы не определяете метод getRouteKeyName() для вашей Products Eloquent модели

Laravel Внедрение зависимостей контроллеров Надеюсь, что это решит это!

0 голосов
/ 28 января 2020

Как предположил Харвен, проблема заключалась в том, что маршрут ресурса не был определен должным образом. После удаления backsla sh все начало работать:

Route::resource('admin/products', 'ProductsController')->middleware('auth');

После этого список маршрутов был заполнен правильно, и имя маршрута также было правильно сгенерировано

| GET|HEAD| admin/products/{product}/edit | products.edit | App\Http\Controllers\ProductsController@edit | web,auth |

...