Laravel 6.0如何让Route::resource路由名与控制器目录匹配
解决Laravel 6.x资源路由名自动带命名空间前缀的问题
我完全懂你的烦恼——手动给每个资源路由加->names()实在太啰嗦了,其实Laravel 6.x本身就有更优雅的方式实现你想要的backend.product.index格式路由名,不用重复写命名规则。
方法一:路由分组统一配置(推荐)
这是最适合后端这类有统一前缀场景的方案,把所有后端路由放进一个分组,一次性配置URL前缀、命名空间和路由名前缀:
Route::prefix('backend') // 给所有路由URL添加/backend前缀 ->name('backend.') // 给所有路由名添加backend.前缀 ->namespace('Backend') // 指定控制器所在的Backend命名空间 ->group(function () { Route::resource('product', 'ProductController'); // 后续新增的后端资源路由(比如CategoryController)也能自动继承前缀规则 });
配置完成后执行php artisan route:list,就能看到生成的路由名都是backend.product.index、backend.product.create这类完全符合预期的格式,而且后续维护新路由也不用重复配置,扩展性拉满。
方法二:单个资源路由指定as参数
如果只是针对某一个资源路由需要这个效果,也可以直接在resource方法里传入as参数:
Route::resource('/backend/product','Backend\ProductController', ['as' => 'backend']);
这个参数会给当前资源路由的所有子路由名加上backend.前缀,同样能生成backend.product.index这类命名。
为什么原来的配置不生效?
Laravel默认生成资源路由名时,只会取控制器类名去掉命名空间后的部分(比如ProductController对应product前缀),不会自动识别控制器所在的命名空间并加到路由名里,所以需要我们通过上面的方式手动指定前缀规则。
内容的提问来源于stack exchange,提问作者story ks
相关产品推荐
相关产品推荐

