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

Posted

技术标签:

【中文标题】Laravel 6.0 php artisan route:list 返回“目标类 [App\\Http\\Controllers\\SessionsController] 不存在。”【英文标题】:Laravel 6.0 php artisan route:list returns “Target class [App\Http\Controllers\SessionsController] does not exist.”Laravel 6.0 php artisan route:list 返回“目标类 [App\Http\Controllers\SessionsController] 不存在。” 【发布时间】:2020-01-11 21:35:45 【问题描述】:

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

Illuminate\Contracts\Container\BindingResolutionException : 目标 类 [App\Http\Controllers\SessionsController] 不存在。

在 /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:806 802| 803|尝试 804| $reflector = new ReflectionClass($concrete); 805| 捕捉(反射异常 $e) > 806| throw new BindingResolutionException("目标类 [$concrete] 不存在。", 0, $e); 807| 808| 809| // 如果类型不可实例化,开发者正在尝试解析 810| // 一个抽象类型,例如接口或抽象类,并且有

异常跟踪:

1 Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Consoleclosure(Object(Illuminate\Routing\Route)) [内部]:0

2 ReflectionException::("类 App\Http\Controllers\SessionsController 不存在") /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 了吗? 你有SessionsController吗? 真丢脸。我以为我创建了 SessionsController,但我没有。创建它并运行 php artisan config:cache 后它就可以工作了。非常感谢您的快速回复! 也可以是控制器顶部的命名空间 【参考方案1】:

你必须指定类的完整路径

以前是

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

现在变成了

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

【讨论】:

【参考方案2】:

只需在app->Providers->RouteServiceProvider.php中添加以下行

protected $namespace = 'App\\Http\\Controllers';

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

我认为这是完美的答案:

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

【讨论】:

【参考方案5】:

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

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

我意识到我在“AlbumContoller”中的拼写错误,我将其重命名为“AlbumController”。所以我忘记了“r”

我在web.php中重命名了文件和控制器名和控制器名之后

Route::resource('albums', 'AlbumsController');

一切正常

所以你不需要这两个:

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

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

【讨论】:

这对我有用,我已将 'BannerController' 放在引号之间【参考方案6】:

我正在从 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:返回之前的行为

因为只有当你通过创建一个全新的 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 或 https://laravel.com/docs/8.x/upgrade(搜索“路由”)。

【讨论】:

刚刚碰到这个!希望文档得到更新+他们不会改变这样的小事。烦人。 @Vincent 是的,删除一种语法支持会完全破坏整个项目,对吗?他们本可以将两者都集成在一起。 除此更改外,默认命名空间现在为空。添加命名空间,您不必使用 use 语句指定每个控制器:namespace App\Http\Controllers; 这样的东西适用于 Route::group(["namespace" => "App\Http\Controllers\Web"], function () Route::get('/', 'Website @home'); );【参考方案7】:

我在我的电脑上运行 Laravel 8.x。 这个错误让我很头疼。要重新创建错误,这就是我所做的: 首先,我创建了一个名为 MyModelController.php 的控制器 其次,我编写了一个简单的函数来返回一个包含“Hello World”的刀片文件,称为 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']);

【讨论】:

该问题指定了 Laravel 版本 6,其中提供的语义正常工作。 实际上,我也在使用 Laravel 8,他的回答对我有用。并且他明确表示他的解决方案是针对 Laravel 8.x 我在使用 Laravel 8 时遇到了类似的问题。原来我没有在路由页面 (web.php) 的顶部包含控制器:use App\Http\Controllers\NameOfController;【参考方案8】:

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

使用 App\Http\Controllers\UserController;

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

【讨论】:

【参考方案9】:

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

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;
    

【讨论】:

【参考方案10】:

在我的情况下,它是通过运行解决的

php artisan optimize:clear
php artisan config:cache

optimize:clearcommands 清除所有内容

【讨论】:

这对我的错误消息不起作用,Illuminate\Contracts\Container\BindingResolutionException 目标类 [MessagesController] 不存在。无论如何谢谢你【参考方案11】:

我遇到了同样的问题,但使用的是中间件控制器。所以最后我在 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
    ];

【讨论】:

【参考方案12】:

替换-

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

与-

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

转发/用\

【讨论】:

【参考方案13】:

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

    /**
     * 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
        ],
    ];

【讨论】:

【参考方案14】:

这些都是我做的

1:php 工匠配置:缓存

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

3:作曲家转储自动加载

4: 只是将路径中的正/斜杠改为反向\。

第四个对我有用。

【讨论】:

此解决方案无法解决我的错误,感谢您的帮助。【参考方案15】:

尝试更正您的控制器名称

我的路线是

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

我的控制器是

class liensController extends Controller

  // all the methods of controller goes here.

【讨论】:

【参考方案16】:

就我而言,这是 Linux 文件名区分大小写的问题。对于名为IndexController 的文件,具有Indexcontroller 将在Windows 中有效,但在Linux 中无效

【讨论】:

【参考方案17】:

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

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

);

我所要做的就是从组中删除所有不必要/未使用的选项。就这样。

【讨论】:

【参考方案18】:

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

composer dump-autoload

【讨论】:

【参考方案19】:

在我的情况下,由于正斜杠 / 而发生了相同的 error,但在定义路由时它应该是反斜杠 \

当您在 folder 中有控制器时会发生这种情况,就像在我的情况下控制器在 api 文件夹中一样,因此在提及控制器名称时始终使用反斜杠 \

参见示例:

容易出错的代码:

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

解决方案代码:

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

【讨论】:

【参考方案20】:

运行这个命令

  php artisan config:cache 

【讨论】:

以上是关于Laravel 6.0 php artisan route:list 返回“目标类 [App\Http\Controllers\SessionsController] 不存在。”的主要内容,如果未能解决你的问题,请参考以下文章

如何手动使用 composer, artisan ...(Laravel) php 命令

php Laravel Artisan迁移实例

php Laravel Artisan Migrate创建领域

无法 php artisan 迁移 - Laravel

laravel 自动删除 php artisan serve 上的 server.php

如何使用 Artisan 命令 (PHP) 在 Laravel 5.2 中创建 RESTful 资源控制器