Symfony3 ClassNotFoundException 在捆绑包创建后

2022-08-30 13:35:30

我想在Symfony中启动一个新的3.3项目,并像往常一样开始:

1.) 创建新项目:symfony new ArtProject

2.) 创建一个新的捆绑包:(Paul/ArtBundle, yml, src/)php app/console generate:bundle

然后我运行本地服务器,当我打开127.0.0.1:8000时,我得到这个漂亮的消息:

(1/1) ClassNotFoundException

尝试从命名空间 “Paul\ArtBundle” 加载类 “PaulArtBundle”。是否忘记了另一个命名空间的“use”语句?在 AppKernel.php(第 19 行)

这很奇怪,到目前为止,我还没有弄清楚为什么会发生这种情况。在创建捆绑包之前,没有错误;我看到了symfony的典型起始页。

public function registerBundles()
{
    $bundles = [
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        ......
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new AppBundle\AppBundle(),
        new Paul\ArtBundle\PaulArtBundle(),
    ];
}

<?php

namespace Paul\ArtBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class PaulArtBundle extends Bundle
{
}

你知道那里发生了什么吗?我没有改变任何东西,我只运行了这些命令。


答案 1

我刚刚安装了S3.3.4(撰写本文时的最新版本)的新副本,使用:

composer create-project symfony/framework-standard-edition s334 "3.3.4"
bin/console generate:bundle
Share across multiple apps: yes
namespace: Paul\ArtBundle
bundle name: PaulArtBundle
Target Directory: src/

刷新浏览器,果然我得到了类未找到的消息。

当引入新的命名空间时,generate:bundle 命令不会更新 composer.json 的 autload 部分。编辑 composer.json 并:

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

然后运行

composer dumpautoload

然后重新启动服务器(也许)。这应该可以解决捆绑包类未找到的问题。

自从标准将所有内容都放在AppBundle下以来,我还没有使用过generation:bundle命令很长一段时间,所以我不知道这已经“破坏”了多长时间。但在过去一周左右的时间里,至少有三个问题表明这是最近的事情。

顺便说一句,当我刷新浏览器时,我得到了“Hello World”,这让我有点震惊。事实证明,新的捆绑包覆盖了/路由,这也是一种特殊。

如果有人想知道为什么会发生这种情况,Symfony 3.2从

#composer.json
"psr-4": { "": "src/" },
To
"psr-4": { "AppBundle\\": "src/AppBundle" },

你总是可以把它改回来,尽管我认为拼出单个命名空间可能是“更好的”。不确定。

这里有一个包含更多细节的问题:https://github.com/symfony/symfony-standard/issues/1098

看起来维护者更喜欢微小的速度改进,而不是破坏现有的命令。哦,好吧。Symfony Flex应该让一切再次变得伟大。


答案 2

如果您生成一个捆绑包以便在多个项目(具有自己的命名空间)中使用,则需要将其添加到 as follwed 中:composer.json

让我们假设您的捆绑包名称带有命名空间,然后 composer 自动加载部分应如下所示:CompanyFooBundleCompany\Bundle\FooBundle

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

推荐