【问题标题】:Controller class in Laravel 4.2 vendor/package/src/controllers directory not foundLaravel 4.2 vendor/package/src/controllers 目录中的控制器类未找到
【发布时间】:2015-07-19 21:11:05
【问题描述】:

类似于this poster,我正在尝试使用位于 Laravel 供应商文件夹中的控制器。 (我已经遵循了该答案中给出的所有建议以及其他几个类似的建议。)作为一个简化案例,考虑一个 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 的路线工作

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

{
  "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/"
    }
  }
}

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

【问题讨论】:

  • 尝试将 psr-0 切换到 psr-4
  • 嗯...现在它告诉我它找不到我的服务提供者类。
  • 看看Seer提供的答案,它更深入。另请查看this 以了解 PSR-0 和 PSR-4 之间的差异

标签: php laravel-4 laravel-routing


【解决方案1】:

您的命名空间与您告诉 Composer 自动加载的名称不匹配。你说“我的源文件夹是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

【讨论】:

  • 感谢您的链接;我将阅读 psr-4。需要明确的是,HulkControllersrc\Marvel\Avengers 中时有效,但在 src\controllers 中时有效。
  • 尝试将您的 PSR-0 命名空间设置为 Marvell\\Avengers\\ ,并在末尾添加 2 个斜线。看看这是否使它只适用于src/
  • 接受这个答案,因为我使用 PSR-4 比使用任何其他方法更进一步。感谢您的帮助,我很抱歉长时间延迟回复。
猜你喜欢
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-02
  • 2015-06-24
  • 2021-09-25
  • 2015-05-21
  • 2015-08-31
相关资源
最近更新 更多