我遇到了Laravel路由问题。我真的不明白为什么我的route:list告诉我URL后面附加了{}
空吗?我相信这是我的电话返回404找不到的原因。
我希望DepartmentController
放在分组的正文中,因为我需要将ID用于其他目的。如果我将ressource
移到前缀/组之外,则此场景有效,但其他场景无效。这是我设计路线的首选方式,但令我感到困扰的是/
不仅使用前缀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' );
并请求网址:/department/1/editasddas
。它按照预期的方式工作,但是实际上我使用ressource的原因是:保持路由尽可能干净。出于这个原因,资源路由也已实现,我只需要实现基本的CRUD操作。这是Laravel中的错误,还是基本上不可能? -我觉得很奇怪。没那么复杂。
答案 0 :(得分:1)
我认为您遇到了这个问题,因为Route::resource
本身是如何创建子路由的(在URL中自动添加资源参数,该参数最后为{}
)。
另外,请注意,您当前正在生成一个带有Department参数的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. */
});
答案 1 :(得分:0)
仅Route::resource
方法即可实现您所需要的:
Route::resource( 'department', 'DepartmentController' );
在此处https://laravel.com/docs/5.8/controllers#resource-controllers
上检查文档