在使用Laravel 8时出现“目标类控制器不存在”错误。

327

这是我的控制器:

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        dd('aa');
    }
}

正如屏幕截图所示,该类存在且位于正确的位置:

在此输入图片描述

我的api.php路由:

Route::get('register', 'Api\RegisterController@register');
当我在Postman中访问register路由时,出现了以下错误:

目标类[Api\RegisterController]不存在。

如何解决?


多亏了回答中的建议,我已经修复了它。我决定为此路由使用完全合格的类名,但还有其他选项,如答案中所述。

Route::get('register', 'App\Http\Controllers\Api\RegisterController@register');

1
欢迎来到 SO..你的控制器是否在 Api 文件夹内? - Kamlesh Paul
4
您需要重新生成类,可以通过执行 composer dump-autoload 命令来实现,或者在您的 RegisterController 中添加缺失的命名空间。 - STA
2
然后尝试运行 composer dump-autoload - Kamlesh Paul
5
找到了解决这个问题的正确方法:https://www.scratchcode.io/laravel-8-target-class-controller-does-not-exist/。 - Mayank Dudakiya
1
如果你想在 Laravel 8 中使用资源路由,则使用以下代码: Route::resource('xyz', App\Http\Controllers\XyzController::class); - Muhammad Shahzad
显示剩余5条评论
32个回答

0
请在 Web.php 文件中添加以下代码行:

use App\Http\Controllers\RegisterController;


0

确保在路由中使用正确的文件名。

例如:

如果你的控制器文件名为User.php,请确保你使用的是User而不是UserController


0

当我运行php artisan route:list时,遇到了相同的错误。在我的情况下,我已经删除了资源控制器,但路由仍然被定义。我必须确保在我的routes/web.php文件中注释掉相关类。


0

如果您喜欢对这些路由进行分组,可以这样做:

Route::group(['namespace' => 'App\Http\Controllers\Api'], function () {
    Route::resource('user', 'UserController');
    Route::resource('book', 'BookController');
});

0
在 Laravel 9 中,无需在 RouteServiceProvider 中添加命名空间。
代替:
Route::resource('tickets', 'TicketController');

使用

Route::resource('tickets', TicketController::class);

0

对我来说,我不得不将我的路由命名更改为最近支持的格式,正如其他人所提到的:

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);

然而,直到我运行了这个终端命令,它才停止给我报错:

php artisan route:clear

-1

当我将 null 传递给 middleware 函数时,这种情况发生在我身上:

Route::middleware(null)->group(function () {
    Route::get('/some-path', [SomeController::class, 'search']);
});

传递 [] 表示不使用任何中间件。如果没有使用中间件,可以考虑删除 middleware 调用 :D

-1
我遇到了这个错误:
(Illuminate\Contracts\Container\BindingResolutionException 目标类[App\Http\Controllers\ControllerFileName]不存在。
解决方案: 只需检查您的类名称。它应该与您的文件名完全相同。

-1
自Laravel v8以来,有趣的是可以使用Route::controller(MyController::class)...
https://laravel.com/docs/10.x/routing#route-group-controllers 在我的情况下,我改变了之前的Laravel v7代码。
// CRUD Sample
Route::group(['prefix' => 'sample'], function ($router) {       // sample
    Route::get('/', 'SampleController@index');
    Route::get('/new', 'SampleController@create')->middleware('auth');
    Route::post('/store', 'SampleController@store')->middleware('auth');
    Route::group(['prefix' => '/edit'], function ($router) {            // sample/edit/{number}
        Route::get('/{number}', 'SampleController@edit')->middleware('auth');
        Route::get('/{number}/{migrate?}', 'SampleController@edit')->middleware('auth');
        Route::post('/', 'SampleController@store')->middleware('auth');
    });
});

对于较少冗长的版本(例如v8或更高版本...在我的情况下是v10):
// CRUD Sample
Route::controller(SampleController::class)->prefix('sample')->group(function () {
    Route::get('/', 'index');
    Route::get('/new', 'create')->middleware('auth');
    Route::post('/store', 'store')->middleware('auth');
    Route::prefix('/edit')->middleware('auth')->group(function () {         // sample/edit/{number}
        Route::get('/{number}', 'edit');
        Route::get('/{number}/{migrate?}', 'edit');
        Route::post('/', 'store');
    });
});

然后运行php artisan route:cache
然后运行php artisan route:list
不再返回任何错误!-)
我不明白为什么每次都不能正常工作,例如:->prefix
// CRUD Licence
/* doesn't work
Route::controller(LicenceController::class)->middleware('auth')->prefix('licence')->group(function () {
    Route::get('/', 'index');
    Route::get('/new', 'new');
    Route::post('/new', 'insert');
});
*/
// works :
Route::controller(LicenceController::class, function () {
    Route::get('/licence', 'index')->middleware('auth');
    Route::get('/licence/new', 'new')->middleware('auth');
    Route::post('/licence/new', 'insert')->middleware('auth');
});

-1

此外,也许需要将其分组到\App\Http\Kernel::$middlewareGroups,这对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接