Laravel路由分组在PHP 8下完全兼容,核心用法不变;必须使用Route::group()的典型场景包括共享路径前缀、中间件、命名空间、名称前缀或子域名。

Laravel 路由分组在 PHP 8 环境下用法完全兼容,语法、逻辑和约束规则与 Laravel 9/10 一致。关键不是 PHP 版本本身驱动分组行为,而是 Laravel 框架对路由分组的设计机制——PHP 8 只是让类型声明更严谨、错误提示更清晰,不会改变 Route::group() 的核心用法。
必须用 Route::group() 的典型场景
当多个路由共享以下任意一项时,就该抽成组:
- 相同路径前缀(如
/admin,/api/v1) - 相同中间件(如
auth,verified,throttle:60,1) - 相同控制器命名空间(如
Admin,Api\V1) - 相同路由名称前缀(如
admin.、api.v1.) - 相同子域名(如
api.example.com)
基础写法(推荐数组键名全小写 + 字符串值)
Route::group([
'prefix' => 'admin',
'middleware' => ['auth', 'can:manage-system'],
'namespace' => 'Admin',
'as' => 'admin.',
], function () {
Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard');
Route::get('users', [UserController::class, 'index'])->name('users.index');
});注意:
-
prefix值不加开头或结尾斜杠(写'admin',别写'/admin/') -
as值末尾必须带点('admin.'),否则route('admin.dashboard')找不到 -
namespace是相对于App\Http\Controllers\的路径,必须用字符串('Admin',不能写Admin) -
middleware必须是字符串数组,每个中间件名加单引号
API 版本分组(常见且实用)
在 routes/api.php 中按版本隔离:
Route::prefix('v1')->middleware('api')->group(function () {
Route::get('/users', [V1\UserController::class, 'index']);
});
Route::prefix('v2')->middleware('api')->group(function () {
Route::get('/users', [V2\UserController::class, 'index']);
});好处:
立即学习“PHP免费学习笔记(深入)”;
- URL 明确(
/api/v1/usersvs/api/v2/users) - 控制器可完全独立,避免 if-else 判断版本
- 中间件、限流策略可按版本差异化配置
子域名分组(需配合 Web 服务器)
Route::domain('api.example.com')->group(function () {
Route::middleware('auth:sanctum')->group(function () {
Route::get('/me', [ProfileController::class, 'show']);
});
});前提:
- hosts 文件加
127.0.0.1 api.example.com - Nginx/Apache 配置中
server_name包含该子域 - 不要用
['domain' => '...']这种旧语法,Laravel 5.3+ 只认Route::domain(...)->group()
嵌套分组要手动拼接,不自动继承
错误写法(以为会自动组合前缀):
Route::group(['prefix' => 'admin'], function () {
Route::group(['prefix' => 'settings'], function () {
Route::get('list', ...); // 实际匹配 /settings/list ❌
});
});正确写法(外层 prefix + 内层完整路径):
Route::group(['prefix' => 'admin'], function () {
Route::group(['prefix' => 'admin/settings'], function () {
Route::get('list', ...); // 匹配 /admin/settings/list ✅
});
});或者直接扁平化:
Route::prefix('admin')->group(function () {
Route::prefix('settings')->group(function () {
Route::get('list', ...); // Laravel 自动拼为 /admin/settings/list ✅
});
});不复杂但容易忽略



















