Laravel 控制器:修改资源路由动作名称 3 个改进

问题

如题,如何在资源路由定义中修改动作默认的路由名称?

回答

默认情况下,所有资源控制器动作都有一个路由名称。假如我们通过以下命令创建了一个 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

参考

本文为 Wiki 文章,邀您参与纠错、纰漏和优化
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!