为了将现有的Symfony 2.8项目迁移到Symfony 3.4,我首先 Build 了一个新的Symfony 3.4项目 .

将我的软件包添加到新项目后,Symfony会在AppKernel.php中抛出一个 ClassNotFoundException

ClassNotFoundException尝试从命名空间“Namespace \ MyBundle”加载类“MyBundle” . 您是否忘记了另一个命名空间的“use”语句?在AppKernel.php中(第17行)

我发现了这个问题的几个问题和答案,解决方案非常简单:

// Symfony 2.8 composer.json
...
"autoload" : {
    "psr-0" : {
        "" : "src/"
    }
},


// Symfony 3.4 composer.json
...
"autoload": {
    "psr-4": {
        "AppBundle\\": "src/AppBundle"
    },
    "classmap": [
        "app/AppKernel.php",
        "app/AppCache.php"
    ]
},

由于Symfony 3.4不再定义 "" : "src/" ,但包含具有 "AppBundle\\": "src/AppBundle" 的具体包,解决方案是在此处添加我的包:

"autoload": {
    "psr-4": {
        "AppBundle\\": "src/AppBundle",
        "MyBundle\\": "src/MyBundle"
    },
    "classmap": [
        "app/AppKernel.php",
        "app/AppCache.php"
    ]
},

However, while this fixes the problem I wonder what is the advantage of including concrete bundles over using "" : "src/".

这种方法的缺点是非常明显的:当添加一个新的bundle时,我还有一个地方需要指定它 .

What is the advantage? Is it better to add each bundle or can I simply keep using "" : "src/"?