Laravel 6.0 php artisan route:list returns “目标 class [App\Http\Controllers\SessionsController] 不存在。”

Laravel 6.0 php artisan route:list returns “Target class [App\Http\Controllers\SessionsController] does not exist.”

我正在使用 Laravel 6.0 并尝试使用 artisan route:list 列出我的所有路线,但它失败了 returns:

Illuminate\Contracts\Container\BindingResolutionException : Target class [App\Http\Controllers\SessionsController] does not exist.

at /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:806 802| 803| try { 804| $reflector = new ReflectionClass($concrete); 805| } catch (ReflectionException $e) { > 806| throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e); 807| } 808| 809| // If the type is not instantiable, the developer is attempting to resolve 810| // an abstract type such as an Interface or Abstract Class and there is

Exception trace:

1 Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Console{closure}(Object(Illuminate\Routing\Route)) [internal]:0

2 ReflectionException::("Class App\Http\Controllers\SessionsController does not exist") /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:804

3 ReflectionClass::__construct("App\Http\Controllers\SessionsController") /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:804

到目前为止,我只有一个非常简单的 web.php 路由文件:

Route::get('/', function () {
    return view('index');
});


Route::prefix('app')->group(function () {
    // Registration routes
    Route::get('registration/create', 'RegistrationController@create')->name('app-registration-form');
});


// Templates
Route::get('templates/ubold/{any}', 'UboldController@index');

知道如何调试这个问题吗?

运行 这个命令

  php artisan config:cache 

在我的例子中,由于正斜杠 / 而发生相同的 error 但在定义路由时它应该是反斜杠 \

当你在 folder 中有控制器时会发生这种情况,就像在我的情况下控制器在 api 文件夹中,所以在提到控制器名称时总是使用反斜杠 \

参见示例:

易错代码:

Route::apiResource('categories', 'api/CategoryController');

解决方案代码:

Route::apiResource('categories', 'api\CategoryController');

对于那些对 Illuminate\Contracts\Container\BindingResolutionException : Target class [<className>] does not exist. 消息有类似问题的人,这也可能会有所帮助:

composer dump-autoload

好吧,我遇到了类似的问题,我想变得聪明,所以我在 web.php

中写了这个
Route::group([
    'middleware'    => '', // Removing this made everything work
    'as'            => 'admin.',
    'prefix'        => 'admin',
    'namespace'     => 'Admin',
],function(){

});

我所要做的只是从组中删除所有 unnecessary/unused 选项。就这样。

尝试更正您的控制器名称

我的路线是

Route::get('/lien/{id}','liensControler@show');

我的控制器是

class liensController extends Controller
{
  // all the methods of controller goes here.
}

在我的例子中,这是 Linux 文件名区分大小写的问题。对于名为 IndexController 的文件,具有 Indexcontroller 的文件在 windows 中有效,但在 Linux

中无效

这些我都做了

1: php artisan config:cache

2:检查控制器名称拼写。

3:作曲家dump-autoload

4: 刚把路由中的正斜杠改成了反斜杠。

第 4 个对我有用。

我在我的中间件组中错误地留下了一个空的中间件 class 时遇到了这个问题:

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:100,1',
            'bindings',
            'localization',
            '' // Was empty by mistake
        ],
    ];

替换-

Route::resource('/admin/UserOff','admin/UsersController');

与-

Route::resource('/admin/UserOff','admin\UsersController');

转发/与\

我有同样的问题,但有一个中间件控制器。所以最后我在 kerner.php 文件中链接了那个中间件。它位于 app\Http\Kernel.php

我在路由中间件中添加了这一行。
'authpostmanweb' => \App\Http\Middleware\AuthPostmanWeb::class

  protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
        'authpostmanweb' => \App\Http\Middleware\AuthPostmanWeb::class
    ];

在我的案例中,运行

解决了这个问题
php artisan optimize:clear
php artisan config:cache

optimize:clear命令清除一切

我正在从 Laravel 7 升级到 Laravel 8(Laravel 8 仍在开发中几天)并且也遇到了这个问题。

解决方案是在路由中使用控制器的类名表示:

所以在 web.php 而不是

Route::get('registration/create', 'RegistrationController@create')

现在是:

解决方案 1:类名表示法

use App\Http\Controllers\RegistrationController;

Route::get('/', [RegistrationController::class, 'create']);

解决方案 2:字符串语法

或作为字符串语法(完整命名空间控制器名称):

Route::get('/', 'App\Http\Controllers\RegistrationController@create');

解决方案 3:Return 以前的行为

因为只有当您通过创建一个全新的 laravel 项目来升级您的应用程序时才会出现这个问题,您也可以 将默认名称空间添加到 RouteServiceProvider

app/Providers/RouteServiceProvider.php

class RouteServiceProvider extends ServiceProvider
{
    /* ... */
     
    /** ADD THIS PROPERTY
     * If specified, this namespace is automatically applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::middleware('web')
                ->namespace($this->namespace) // <-- ADD THIS
                ->group(base_path('routes/web.php'));

            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace) // <-- ADD THIS
                ->group(base_path('routes/api.php'));
        });
    }

    /* ... /*
}

另请参阅 https://laravel.com/docs/8.x/routing#basic-routing or https://laravel.com/docs/8.x/upgrade(搜索“路由”)。

现在您可以在控制器文件夹外使用控制器

use App\Http\submit;

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

现在我的控制器在 http 文件夹中很兴奋

你必须在控制器文件中改变一些东西

<?php

namespace App\Http;

use Illuminate\Http\Request;
use Illuminate\Http\Controllers\Controller;
class submit extends Controller {
    public function index(Request $req) {
        return $req;
    }
}

您可以像这样定义到此控制器操作的路由:

使用App\Http\Controllers\UserController;

Route::get('user/{id}', [UserController::class, 'show']);

我在电脑上 运行 Laravel 8.x。 这个错误让我很头疼。要重新创建错误,这就是我所做的: 首先,我创建了一个名为 MyModelController.php 的控制器 其次,我为 return 一个包含 'Hello World' 的 blade 文件编写了一个简单的函数,称为 myFunction。 最后,我创建了一条路线: Route::get('/','MyModelController@myFunction'); 这没有用。

我就是这样解决的。 首先,您必须阅读以下文档: (https://laravel.com/docs/8.x/releases#laravel-8)

在 'web.php' 文件中,这是我为使其工作而编写的路由:

使用App\Http\Controllers\MyModelController;

Route::get('/', [MyModelController::class, 'myFunction']);

在 Larave 7 上我遇到了同样的问题。

我检查了控制器名称的拼写。

我发现“AlbumContoller”拼写错误,我将其重命名为“AlbumController”。所以我忘了“r”

我在 web.php

中重命名文件和控制器名称和控制器名称后
Route::resource('albums', 'AlbumsController');

一切正常

所以你不需要这两个:

1- 使用 App\Http\Controllers\IndexContoller;

2- Route::get('/', [MyModelController::class, 'myFunction']);

这是我认为的完美答案:

  • 选项 1:
use App\Http\Controllers\HomepageController;
Route::get('/', [HomepageController::class, 'index']);
  • 选项 2:
Route::get('/', 'App\Http\Controllers\HomepageController@index');

只需检查 web.php 即可查看大小写字母

只需在 app->Providers->RouteServiceProvider.php

中添加以下行
protected $namespace = 'App\Http\Controllers';

您必须指定 class

的完整路径

之前是

Route::get('/wel','Welcome@index');

现在改成了

use App\Http\Controllers\Welcome;
Route::get('wel',[Welcome::class,'index']);