您正在使用 Laravel 8。在 Laravel 8 的全新安装中,未对加载路由的路由组应用命名空间前缀。
"在先前的 Laravel 版本中,RouteServiceProvider
含有一个 $namespace
属性。该属性的值会自动作为控制器路由定义和调用 action
帮助程序/URL::action
方法的前缀。在 Laravel 8.x 中,该属性默认为 null
。这意味着 Laravel 不会自动添加命名空间前缀。" Laravel 8.x 文档 - 发布说明
如果不使用命名空间前缀,则在路由中引用控制器时必须使用完全限定类名。
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);
Route::get('/users', 'App\Http\Controllers\UserController@index');
如果您喜欢旧的方式:
App\Providers\RouteServiceProvider
:
public function boot()
{
...
Route::prefix('api')
->middleware('api')
->namespace('App\Http\Controllers')
->group(base_path('routes/api.php'));
...
}
对于您想要声明命名空间的任何路由组,请进行以下操作。
$namespace 属性:
尽管在发布说明中提到需要在 RouteServiceProvider
上设置一个 $namespace
属性,而且在您的 RouteServiceProvider
中也有注释,但它不会影响您的路由。目前它只用于为生成操作URL添加命名空间前缀。因此,您可以设置此变量,但它本身不会添加这些命名空间前缀,您仍然必须确保在将命名空间添加到路由组时使用该变量。
升级指南中包含了此信息
Laravel 8.x 文档 - 升级指南 - 路由
根据升级指南所示,重要的部分是您正在为路由组定义命名空间。仅设置 $namespace
变量本身仅有助于生成操作URL。
再次强调一下,重要的部分是设置路由组的命名空间,在示例中他们恰好通过直接引用成员变量 $namespace
来实现。
更新:
如果您自 Laravel 8.0.2 版本以来安装了新的 Laravel 8 副本,则可以取消注释 RouteServiceProvider
中的 protected $namespace
成员变量,以回到旧方式,因为路由组设置为使用此成员变量作为组的命名空间。
// protected $namespace = 'App\\Http\\Controllers'
只有一种情况会取消注释,那就是将此变量用作名称空间而设置的路由组才会将名称空间前缀添加到分配给路由的控制器中:
...
->namespace($this->namespace)
...
Api
文件夹内? - Kamlesh Paulcomposer dump-autoload
命令来实现,或者在您的RegisterController
中添加缺失的命名空间。 - STAcomposer dump-autoload
。 - Kamlesh PaulRoute::resource('xyz', App\Http\Controllers\XyzController::class);
- Muhammad Shahzad