laravel路由分组嵌套不继承,仅合并与拼接:prefix路径拼接(如/api/v1/users),middleware数组合并且顺序关键(web须在auth前),namespace需每层显式指定,as命名前缀需手动拼接冒号层级。

路由分组嵌套时,没有继承,只有合并与拼接。Laravel 的分组机制不支持父级配置向下传递,每个 Route::group() 都是独立作用域,它的 middleware、prefix、as、namespace 等属性只影响自身闭包内的路由,不会“默认继承”外层设置,也不会自动覆盖或补全缺失项。
前缀(prefix)是路径拼接,不是覆盖
外层 prefix 和内层 prefix 会按顺序拼接,形成完整 URI 前缀:
- 外层:
Route::group(['prefix' => 'api'], function () { ... }); - 内层:
Route::group(['prefix' => 'v1'], function () { Route::get('users', ...); }); - 最终匹配路径是
/api/v1/users,不是/v1/users或/api/users
注意:prefix 不影响路由名称(name),想让 name 也带层级,必须显式配 as => 'api.v1.'。
中间件(middleware)是数组合并,不是叠加执行
嵌套分组的 middleware 是两个数组的 array_merge 结果,顺序按定义先后排列:
- 外层:
['web'],内层:['auth', 'can:admin'] - 实际执行顺序为
web → auth → can:admin - 但关键点在于:web 中间件组含 session 启动逻辑,若漏掉它或放错位置(比如 auth 在 web 前),session 就不可用,导致 auth 失效
务必确保 web 在需要 session 的分组中显式声明,且置于权限类中间件之前。
命名空间(namespace)不继承,需每层单独指定
namespace 参数只决定当前分组内控制器类的解析起点,不会从外层“延续”:
- 外层
['namespace' => 'Api']不会让内层自动变成Api\V1 - 若要指向
App\Http\Controllers\Api\V1\UserController,内层必须写['namespace' => 'Api\V1'] - 常见错误:只在外层设 namespace,内层路由却找不到控制器——因为 Laravel 拼的是
Api\UserController,而非预期的Api\V1\UserController
路由名称(as)支持冒号拼接,但需手动控制
as 参数值会作为前缀加在子路由 name() 上,用冒号连接:
Route::group(['as' => 'admin.'], function () { Route::get('dashboard', ...)->name('dashboard'); });- 生成的完整路由名为
admin.dashboard - 嵌套多层时,如
as => 'api.v1.'+->name('users.index'),结果是api.v1.users.index,不是自动嵌套三层 - as 不会自动继承外层,必须每层自己写;重复定义会覆盖,不是追加
不复杂但容易忽略










