如何在 Laravel 8 中使用旧的 Laravel 路由样式

How to use old Laravel routing style in Laravel 8

我刚刚安装了 Laravel 8,在这个版本中,我必须像这样输入我的路线:

Route::get('/admin/panel', [App\Http\Controllers\Admin\PanelController::class, 'index']);

但我已经习惯了 Laravel 5 看起来像这样的路线:

Route::namespace('Admin')->prefix('admin')->group(function () {
    Route::get('/panel', 'Admin/PanelController@index');
});

那么如何在 Laravel 8 版本中使用此 Laravel 5 路由?

您仍然可以在某种程度上使用它(例如,对路由进行分组和前缀),但是因为您使用的是 FQCN,所以命名空间是多余的。使用“新”路由相对于“旧”路由的主要优势是重构。当您使用支持重构(如 PhpStorm)的 IDE 移动或重命名控制器时,您不需要手动更改控制器的名称和组命名空间。

在 Laravel 5 中,您也可以使用此路由表示法,但文档中未对其进行概述。

要获得类似的感觉,请导入命名空间并仅使用您的 class 名称并删除定义中的命名空间组。

use App\Http\Controllers\Admin\PanelController;

Route::prefix('admin')->group(function () {
    Route::get('panel', [PanelController::class, 'index']);
});

如果您不能接受定义路由的新方法,请取消注释 app/Providers/RouteServiceProvider.php 中的 $namespace 属性,然后您又回到了旧方法。

如果您想继续使用“旧”方式定义路线(即 Controller@action),那么您可以这样做,但您需要更改 RouteServiceProvider 以包含 App\Http\Controllers命名空间。

这是非常简单的,对于 Laravel 8 的更新版本来说,这是取消注释以下行的简单情况:

protected $namespace = 'App\Http\Controllers';

如果您使用的 Laravel 8 版本在 RouteServiceProvider 文件中没有此行,您可以升级 Laravel 版本或手动添加它。如果您手动添加该行,您还需要更新 boot 方法中的 Route 定义以使用 $namespace 属性。同样,这非常简单,只需将以下内容添加到 webapi 定义中:

->namespace($this->namespace)

例如:

Route::middleware('web')
    ->namespace($this->namespace)
    ->group(base_path('routes/web.php'));

那你应该可以走了。