Laravel命名空间资源控制器路由报错问题咨询
问题分析与解决方法
出现这个错误的核心原因是路由组命名空间与控制器完整类名重复拼接:你在路由组里设置了'namespace' => 'Backend\Admin',同时又通过use语句引入了带完整命名空间的控制器类(UserController::class对应的完整路径是App\Http\Controllers\Backend\Admin\Users\UserController),Laravel会自动把路由组的命名空间和这个完整路径拼接,最终生成了错误的类路径Backend\Admin\App\Http\Controllers\Backend\Admin\Users\UserController。
下面提供两种可靠的解决方式:
方式一:移除路由组的命名空间配置(推荐,Laravel 8+ 官方推荐写法)
既然已经通过use语句引入了控制器的完整类路径,就不需要再在路由组里设置namespace了,直接删除该配置即可:
修改后的路由代码:
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\Auth\LoginController; use App\Http\Controllers\Backend\Admin\DashboardController; use App\Http\Controllers\Backend\Admin\Users\UserController; Route::group(['prefix' => 'admin'], function () { // login for super admin Route::middleware('guest')->group(function () { Route::get('/login', [LoginController::class, 'index'])->name('login'); Route::post('/login', [LoginController::class, 'login'])->name('login.submit'); }); Route::middleware(['auth', 'role:Super Admin'])->group(function () { Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard'); Route::get('logout', [LoginController::class, 'logout'])->name('logout'); Route::resource('users', UserController::class); }); });
方式二:保留路由组命名空间,使用相对控制器路径
如果想保留路由组的namespace配置,可以改用字符串形式的相对控制器路径,不再使用::class语法:
修改后的路由代码:
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\Auth\LoginController; Route::group(['namespace' => 'Backend\Admin', 'prefix' => 'admin'], function () { // login for super admin Route::middleware('guest')->group(function () { Route::get('/login', [LoginController::class, 'index'])->name('login'); Route::post('/login', [LoginController::class, 'login'])->name('login.submit'); }); Route::middleware(['auth', 'role:Super Admin'])->group(function () { Route::get('dashboard', 'DashboardController@index')->name('dashboard'); Route::get('logout', [LoginController::class, 'logout'])->name('logout'); Route::resource('users', 'Users\UserController'); }); });
这里路由组的namespace是Backend\Admin,Laravel会自动拼接成App\Http\Controllers\Backend\Admin\Users\UserController,刚好匹配你的控制器命名空间。
内容的提问来源于stack exchange,提问作者bilalahmedcodes
相关产品推荐
相关产品推荐

