我们先来看Laravel 8 的更新日志: 路由命名空间更新 在 Laravel 的早期版本中,RouteServiceProvider 具有 $namespace 属性。该属性的值将自动添加到控制器路由定义的前缀,并调用 action 助手函数或者 URL::action 方法。在 Laravel 8.x 中,默认情况下此属性为 null。这意味着 Laravel 不会自动命名空间前缀。因此,在新的 Laravel 8.x 应用程序中,应使用标准的 PHP 语法定义控制器路由:

1
2
3
use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

ok,了解了前置内容后,就容易多了,因为这一变动,我们经常碰见这种情况,例如,为不同的用户角色设置了 HomeController,例如 Admin/HomeController 和 User/HomeController。 如果在路由中使用完整路径,它看起来像这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
use App\Http\Controllers\Admin\HomeController;
use App\Http\Controllers\User\HomeController;

Route::prefix('admin')->middleware('is_admin')->group(function () {
    Route::get('home', [HomeController::class, 'index']);
});

Route::prefix('user')->middleware('is_user')->group(function () {
    Route::get('home', [HomeController::class, 'index']);
});

这样有个问题,那就是分不清哪个是后台的控制器,当然我们可以设置别名,类似这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
use App\Http\Controllers\Admin\HomeController as AdminHomeController;
use App\Http\Controllers\User\HomeController;

Route::prefix('admin')->middleware('is_admin')->group(function () {
    Route::get('home', [AdminHomeController::class, 'index']);
});

Route::prefix('user')->middleware('is_user')->group(function () {
    Route::get('home', [HomeController::class, 'index']);
});

但是,我觉得这样看起来更优雅:

1
2
3
4
5
6
7
8
9
Route::prefix('admin')->namespace('App\Http\Controllers\Admin')->middleware('is_admin')->group(function () {
    Route::get('home', [HomeController::class, 'index']);
    // ... Admin 命名空间中的其他控制器
});

Route::prefix('user')->namespace('App\Http\Controllers\User')->middleware('is_user')->group(function () {
    Route::get('home', [HomeController::class, 'index']);
    // ... 来自用户命名空间的其他控制器
});