Laravel路由前缀和资源导致找不到404

时间:2019-07-08 07:15:23

标签: laravel

我遇到了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中的错误,还是基本上不可能? -我觉得很奇怪。没那么复杂。

2 个答案:

答案 0 :(得分:1)

我认为您遇到了这个问题,因为Route::resource本身是如何创建子路由的(在URL中自动添加资源参数,该参数最后为{})。

另外,请注意,您当前正在生成一个带有Department参数的index路由,但这并不是真的有用。

对我来说最好的解决方案是移出您的参数:

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

另一方面,department_id参数将不会引起人们的注意。并且您将需要在每个其他自定义路由内添加参数(但这毕竟是Route::resource对其自身路由进行的操作。)


第二个是保留您的前缀并分别声明每个路由。但是您将需要更改默认路由名称,因为department.indexdepartment.show具有完全相同的方法(GETHEAD)和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

上检查文档