Префикс и ресурсы ресурсов Laravel, в результате чего 404 не найдены - PullRequest
1 голос
/ 08 июля 2019

У меня проблема с маршрутизацией Laravel.Я не очень понимаю, почему мой маршрут: список говорит мне, что к URL добавляется пустое {}?Я считаю, что это причина, по которой мои звонки возвращаются 404 не найдены.

Я бы хотел, чтобы DepartmentController находился внутри моего сгруппированного тела, так как мне нужен идентификатор для других целей.Если я переместу ressource за пределы префикса / группы, этот сценарий сработает, а другой - нет.Это мой предпочтительный способ структурирования моих маршрутов, но меня беспокоит, что / не просто использует префиксный URL, но по какой-то причине добавляет к нему {}

Что я делаю неправильно?


URL для вызова: /department/1/edit

Результат: 404 Not Found

Маршруты:

Route::prefix( 'department/{department_id?}' )->group( function () {
     Route::resource( '/', 'DepartmentController' );
}

php artisan route:list:

|        | GET|HEAD  | department/{department_id?}/{}                                           | show                              | App\Http\Controllers\DepartmentController@show                            | web          |
|        | PUT|PATCH | department/{department_id?}/{}                                           | update                            | App\Http\Controllers\DepartmentController@update                          | web          |
|        | DELETE    | department/{department_id?}/{}                                           | destroy                           | App\Http\Controllers\DepartmentController@destroy                         | web          |
|        | GET|HEAD  | department/{department_id?}/{}/edit                                      | edit                              | App\Http\Controllers\DepartmentController@edit                            | web          |
|        | GET|HEAD  | department/{department_id?}/create                                       | create                            | App\Http\Controllers\DepartmentController@create                          | web          |
|        | POST      | department/{department_id?}                                              | store                             | App\Http\Controllers\DepartmentController@store                           | web          |
|        | GET|HEAD  | department/{department_id?}                                              | index                             | App\Http\Controllers\DepartmentController@index                           | web          |

Обновление: Если я создаю собственный маршрут, подобный этому:

Route::get( 'customedit', 'DepartmentController@editasddas' );

и запросите URL: /department/1/editasddas.Это работает так, как и должно быть, но на самом деле есть причина, по которой я использую ресурсы: чтобы сохранить маршруты как можно более чистыми.По этой причине также были реализованы маршруты ресурсов, и мне просто нужно реализовать основные операции CRUD.Это ошибка в Laravel или это в принципе невозможно?- действительно странно, я думаю.Это не так сложно.

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Я думаю, что у вас есть эта проблема, потому что Route::resource создает собственные подпутки (автоматически добавляя параметр ресурса в URL, параметр {} в конце).

Также обратите внимание, что вы в настоящее время генерируете маршрут index с параметром отдела, и это не очень полезно.

Лучшее решение для меня - переместить ваш параметр:

Route::prefix( 'department' )->group( function () {
    Route::resource( '/', 'DepartmentController' );
});

С другой стороны, параметр department_id не будет факультативным. И вам нужно будет добавить параметр в каждый другой пользовательский маршрут (но ведь именно это Route::resource делает со своими собственными маршрутами).


Второй - сохранить префикс и объявить каждый маршрут индивидуально. Но вам нужно будет изменить имена маршрутов по умолчанию, потому что department.index и department.show будут иметь точно такие же методы (GET и HEAD) и URL-адреса (department/{department_id}).

Route::prefix('department/{department_id}')->group(function() {
    Route::match(['get', 'head'], '/', 'DepartmentController@index')->name('department.index');
    Route::match(['get', 'head'], '/show', 'DepartmentController@show')->name('department.show');

   /* Declare all the others. */
});
0 голосов
/ 08 июля 2019

Только метод Route::resource даст то, что вы ищете:

Route::resource( 'department', 'DepartmentController' );

Проверьте документы здесь, https://laravel.com/docs/5.8/controllers#resource-controllers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...