Laravel路由字符串调用控制器报Unidentified Controller错误如何解决
问题原因
你遇到的报错是Laravel版本迭代带来的路由规则变更导致的:
- Laravel 8.0之前的版本,
RouteServiceProvider中默认配置了$namespace = 'App\Http\Controllers'属性,路由加载时会自动给字符串格式的控制器路径拼接该命名空间前缀,所以'ProfilesController@index'的写法可以正常定位到控制器。 - Laravel 8.0及之后的版本,官方默认移除了该
$namespace配置,字符串格式的控制器路径不会自动补全前缀,框架找不到对应类就会抛出Unidentified Controller错误。而你使用的[ProfilesController::class, 'index']写法是基于完全限定类名定位,只要你在路由文件顶部用use App\Http\Controllers\ProfilesController;引入了控制器类,就能正常定位,所以不会报错。
解决方案
你可以根据自己的使用习惯二选一:
方案1:继续使用字符串格式的路由写法
修改app/Providers/RouteServiceProvider.php文件,恢复自动补全命名空间的配置:
- 在
RouteServiceProvider类中声明命名空间属性:
protected $namespace = 'App\Http\Controllers';
- 在
boot方法的路由注册逻辑中,给对应的路由组加上namespace配置:
Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web.php'));
配置完成后,原有字符串格式的路由写法就可以正常运行。
方案2:使用官方推荐的数组格式路由写法(更推荐)
保持当前可用的[控制器类::class, '方法名']写法即可,这种写法支持IDE代码自动补全、跳转,也避免了命名空间拼写错误的问题,是现在Laravel官方推荐的路由写法。只需要注意每次使用控制器前,在路由文件顶部引入对应的控制器类即可:
use App\Http\Controllers\ProfilesController;
内容的提问来源于stack exchange,提问作者daniel leander
相关产品推荐
相关产品推荐

