Laravel 5.6路由自定义命名空间报错:类不存在求助
解决Laravel 5.6路由自定义命名空间导致的控制器类不存在问题
这个报错的原因很明确:Laravel 5.6中路由的namespace方法是基于默认的App\Http\Controllers根命名空间进行拼接的。你写的namespace('App\Modules\Config\Controllers')会被系统自动拼接到默认根命名空间后面,最终变成App\Http\Controllers\App\Modules\Config\Controllers\Config,这显然不是你想要的控制器路径。
下面给你两种常用的解决方法:
方法一:使用绝对命名空间调用控制器
直接在控制器引用前加上反斜杠\,让系统直接解析为绝对命名空间,不再拼接默认根命名空间:
Route::middleware('web')->group(function () { Route::get('config', ['as' => 'config.index', 'uses' => '\App\Modules\Config\Controllers\Config@index']); Route::put('config', ['as' => 'config.update', 'uses' => '\App\Modules\Config\Controllers\Config@update']); Route::patch('config', '\App\Modules\Config\Controllers\Config@update'); });
这种方法不需要修改全局配置,适合只在少数路由组中使用自定义命名空间的场景。
方法二:修改路由服务提供者的默认命名空间
打开app/Providers/RouteServiceProvider.php,找到protected $namespace属性,将其注释或设置为空字符串:
// 原代码 // protected $namespace = 'App\Http\Controllers'; // 修改后 protected $namespace = '';
修改后,路由组中的namespace就会被当作绝对命名空间解析,你原来的路由代码就可以正常使用了:
Route::middleware('web')->namespace('App\Modules\Config\Controllers')->group(function () { Route::get('config', ['as' => 'config.index', 'uses' => 'Config@index']); Route::put('config', ['as' => 'config.update', 'uses' => 'Config@update']); Route::patch('config', 'Config@update'); });
注意:这种方法会影响所有路由,如果你还有其他路由使用默认的App\Http\Controllers下的控制器,需要在路由中手动指定完整命名空间(比如'uses' => 'App\Http\Controllers\HomeController@index')。
内容的提问来源于stack exchange,提问作者TheWebs
相关产品推荐
相关产品推荐

