Symfony4 加载类自定义文件夹“预期查找类...但未找到”时出错

2022-08-30 19:01:23

问题

我正在尝试为我的Symfony项目中的一些共享类设置自定义目录结构。我想在项目的根目录中创建自定义文件夹,并且我想使用Symfony自动加载功能从该文件夹中自动注册服务。

因此,我将自定义服务命名空间添加到 services.yaml 文件中:

# src ./config/services.yaml
services:
    ...

    TestNamespace\:
    resource: '../TestNamespace/*'

  ...

我在自定义文件夹中添加了一个空类:

# src ./TestNamespace/TestClass.php

namespace TestNamespace;

class TestClass
{

}

当我运行该应用程序时,我收到以下错误:

(1/2) InvalidArgumentException
Expected to find class "TestNamespace\TestClass" in file 
"/path/to/ClassLoadErrorDemo/demo/TestNamespace/TestClass.php"
while importing services from resource 
"../TestNamespace/*", but it was not found! Check the
namespace prefix used with the resource.

(2/2) FileLoaderLoadException
Expected to find class "TestNamespace\TestClass" in file 
"/path/to/ClassLoadErrorDemo/demo/TestNamespace/TestClass.php" while 
importing services from resource "../TestNamespace/*", but it was not 
found! Check the namespace prefix used with the resource in 
/path/to/ClassLoadErrorDemo/demo/config/services.yaml (which is loaded 
in resource "/path/to/ClassLoadErrorDemo/demo/config/services.yaml").

我多次仔细检查了路径,命名空间和类名,一切似乎都很好,我不明白为什么我仍然收到错误。./src 文件夹中的控制器似乎加载正常。我在这里做错了什么?

重现步骤

我创建了一个演示存储库来隔离问题。

git clone https://github.com/smoelker/SymfonyClassLoadErrorDemo.git
cd SymfonyClassLoadErrorDemo/demo
composer install
mv TestNamespace/TestClass.php_ TestNamespace/TestClass.php
php bin/console server:start

答案 1

更新您的 composer.json 自动加载设置

{
    [...]
    "autoload": {
        "psr-4": {
            "TestNamespace\\": "TestNamespace/",
            "": "src/"
        }
    },
    [...]
}

运行后:,请重试。composer dump-autoload


答案 2

composer dump-autoload --classmap-authoritative仅当运行命令时目录存在时,才有效。src

这可能是多阶段 Docker 构建的一个问题,特别是当您通常只将 / 复制到构建映像中时。composer.jsoncomposer.lock


推荐