【问题标题】:Namespaced classes not found未找到命名空间类
【发布时间】:2019-03-03 13:39:21
【问题描述】:

在 Symfony4 项目中,我想自动加载在 src 文件夹中定义但其命名空间不以 App 开头的类。假设它以 Acme 开头。

我期待composer.json 中的以下配置能够正常工作,但它没有,并且我得到类未找到异常:

"autoload": {
    "psr-4": {
        "App\\": "src/",
        "Acme\\": "src/"
    }
},

我在这里错过了什么?

【问题讨论】:

  • 你试过运行composer dump吗?
  • 是的,我做到了composer dump-autoload
  • 我以前遇到过这个。出于某种原因,Acme\MyAcme 总是更改为 App\MyAcme。将您的 Acme 类移动到它们自己的目录中,例如 srcAcme 可以。从来不理解这种行为。但人生苦短。
  • 你为什么需要这样的逻辑呢? “classmap”是非 PSR 命名的解决方案。标准化命名空间后,您可以切换到 PSR4 自动加载
  • 哈。我终于想起了我很久以前想出的东西。问题实际上在于自动连线扫描所有文件并试图从中提供服务。 services.yaml 的 App 部分表示它下面的所有文件都是 App 命名空间的一部分。排除您的 Acme 类或将它们移动到 src 下的不同目录并调整资源部分,一切都会好起来的。

标签: symfony composer-php symfony4 psr-4


【解决方案1】:

我没有证据,但我认为你不能在同一个目录中使用同一个命名空间。

可能有App\SomeClassAcme\SomeClass,作曲家会在src/SomeClass.php 中查找它们。

您可以使用classmap 自动加载进行非标准命名。 /src 中应该有 App\,所以应该是这样的:

{
    "autoload": {
        "psr-4": {
            "App\": "src"
        },
        "classmap": "src"
    }
}

我建议在任何地方都使用 PSR-4 路径标准,以防止此类 WTF。在您的情况下,将 Acme 重命名为 App

【讨论】:

  • 会试试的,谢谢。请注意,我在阅读此线程响应时想到了这个想法:github.com/symfony/flex/issues/93#issuecomment-305722625。我以为它会起作用,因为没有人在线程上大喊大叫! XD
  • 这不是作曲家/自动加载问题。 Symfony 中的某些东西实际上改变了命名空间。不知道怎么样。 php 本身可以在一个目录中有多个命名空间。
【解决方案2】:

对我来说,这是有效的

    "autoload": {
    "psr-4": {
        "": "src/"
    }
},

【讨论】:

  • 不错的编辑,这就是过去的工作方式,但不适用于 S4。制作一个快速测试用例并尝试一下。
猜你喜欢
  • 2015-03-06
  • 2015-02-16
  • 2019-11-20
  • 2014-04-05
  • 2021-12-31
  • 1970-01-01
相关资源
最近更新 更多