找不到 Laravel 4.2 vendor/package/src/controllers 目录中的控制器 class

Controller class in Laravel 4.2 vendor/package/src/controllers directory not found

this poster 类似,我正在尝试使用位于 Laravel vendor 文件夹中的控制器。 (我遵循了该答案中给出的所有建议和其他几个类似的建议。)作为一个简化的案例,考虑一个 Laravel 供应商项目目录,形状如下:

    vendor
        marvel
            avengers
                composer.json
                composer.lock
                src
                    controllers
                        HulkController.php
                    Marvel
                        Avengers
                            AvengersServiceProvider.php
                    routes.php

我在项目目录和 Laravel 根目录中 运行 composer dump-autoload,但是当我 运行 "php artisan routes" 我得到这个抱怨:

{"error":{"type":"ReflectionException","message":
"Class Marvel\Avengers\HulkController does not exist",
"file":"C:\wamp\www\marvel\vendor\laravel\framework\src\
Illuminate\Routing\ControllerInspector.php","line":28}}

另一方面,如果我将"HulkController.php"移动到src/Marvel/Avengers目录(与"AvengersServiceProvider.php"一起)并再次转储自动加载,然后 "php artisan routes" 很高兴并且 路由到 HulkController 工作

我已将 src/controllers 添加到 composer.json 文件中的类映射,所以我认为这不是问题所在:

{
  "name": "marvel/avengers",
  "description": "Earth's Mightiest Heroes",
  "authors": [
    {
      "name": "Stan Lee"
    }
  ],
  "require": {
    "php": ">=5.4.0",
    "illuminate/support": "4.2.*"
  },
  "autoload": {
    "classmap": [
      "src/controllers"
    ],
    "psr-0": {
      "Marvel\Avengers": "src/"
    }
  }
}

我个人不介意将我的控制器 类 放在树的更深处,如果需要的话,但这似乎不是惯例,所以我想我一定遗漏了一些东西。我会很感激任何想法。如果有帮助,很高兴 post 代码和配置文件的其他部分。谢谢。

您的命名空间与您告诉 Composer 自动加载的名称不匹配。你说 "my source folder is src/",然后说“HulkControllerMarvel\Avengers 命名空间中,你刚才说的是...... src/。然后你有控制器控制器文件夹 - 不在你说的地方,因此找不到。

将控制器移动到 src/ 文件夹是可行的,因为这正是您所说的位置。

如果您将命名空间更改为 Marvel\Avengers\Controllers\HulkController,将控制器文件夹名称大写,然后将您引用该控制器的任何位置更新为该命名空间,那么它就可以工作了。

另一种方法是改用 PSR-4 而不是 PSR-0,因为 PSR-0 对您的目录结构做出了这些假设,而 PSR-4 没有。

您可以在此处查看更多相关信息:https://getcomposer.org/doc/01-basic-usage.md