Laravel 控制器:修改资源路由动作名称
问题
如题,如何在资源路由定义中修改动作默认的路由名称?
回答
默认情况下,所有资源控制器动作都有一个路由名称。假如我们通过以下命令创建了一个 PhotoController 资源控制器:
$ php artisan make:controller PhotoController --resource
并给控制器注册一个资源路由:
Route::resource('photos', 'PhotoController');
那么这个资源控制器默认的动作及路由名称如下:
HTTP 方法 | URI | 动作 | 路由名称 |
---|---|---|---|
GET | /photos |
index | photos.index |
GET | /photos/create |
create | photos.create |
POST | /photos |
store | photos.store |
GET | /photos/{photo} |
show | photos.show |
GET | /photos/{photo}/edit |
edit | photos.edit |
PUT/PATCH | /photos/{photo} |
update | photos.update |
DELETE | /photos/{photo} |
destroy | photos.destroy |
如果我们想将 create
动作对应的默认路由名称 photos.create
修改为 photos.build
,可以链式调用 name
方法来修改:
Route::resource('photos', 'PhotoController')->name('create', 'photos.build');
批量修改可通过 names
方法:
Route::resource('photos', 'PhotoController')->names([
'show' => 'photos.display',
'store' => 'photos.save',
]);
这时如果调用 route('photos.build')
全局辅助函数可以发现新的路由名称已经生效了。
路由采用 resource 方法,在控制器中使用 FormRequest 进行数据校验时,需要注意路径参数不是 id ,而是对应的路由名称单数,如下
// 更新相片时,我们的路由是`/photos/{photo}`,可以通过下面方式获取括号里面的路径参数值
$this->route('photo')
当自己命名不符合英文单复数规范时,上述原则可能不适用,你也许始终找得不到正确的参数值,此时可以通过命令行查看路由的列表的URI
列中的路径参数名称。
php artisan route:list