【问题标题】: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\Console{closure}(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 后它就可以工作了。非常感谢您的快速回复!
  • 也可以是控制器顶部的命名空间

标签: laravel laravel-artisan


【解决方案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-routinghttps://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 
                              

                              【讨论】:

                                猜你喜欢
                                • 2020-12-18
                                • 1970-01-01
                                • 2020-06-13
                                • 2020-05-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2021-02-12
                                • 2015-07-12
                                • 2020-06-18
                                相关资源
                                最近更新 更多