提问者:小点点

Symfony3 ClassNotFoundException创建包后发生异常


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

1.)创建新项目:symfony新艺术项目

2.)创建新捆绑包:php应用程序/控制台生成:捆绑包(Paul/ArtBundle,yml,src/)

然后我运行本地服务器,打开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
{
}

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


共3个答案

匿名用户

我刚刚安装了一个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/

刷新了浏览器,果然收到了“找不到类”消息。

当引入新的命名空间时,生成:捆绑命令不会更新composer.json的自动加载部分。编辑composer.json和:

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

然后跑

composer dumpautoload

然后重新启动服务器(可能)。这将修复bundle类未找到的问题。

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

顺便说一句,当我刷新浏览器时,我得到了“你好世界”,这让我有点困惑。事实证明,新的包覆盖了/路由,这也有点特殊。

如果有人想知道为什么会这样,交响乐3.2从

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

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

下面是一个更详细的问题:https://github.com/symfony/symfony-standard/issues/1098

看起来维修人员倾向于稍微提高速度,而不是破坏现有命令。哦,好吧。Symfony Flex应该能让一切再次变得伟大。

匿名用户

如果您生成一个捆绑包用于多个项目(具有自己的命名空间),则需要将其添加到编写器中。json如下所示:

假设您的bundle名称为CompanyFooBundle,名称空间为Company\bundle\FooBundle,那么composer autoload部分应该如下所示:

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

匿名用户

这适用于我在:

生成您的捆绑包

./控制台生成:bundle

像往常一样,按照步骤做,现在,在你的作曲家身上做你想做的事。json文件的行

"AppBundle\\": "src/AppBundle"

替换为“”:“src/”或添加您的捆绑包,例如:“BackendBundle\\”:“src/BackendBundle”

以下是新的部分:

>

  • 在bin目录中安装composer,从中复制并粘贴步骤https://getcomposer.org/download/

    在项目目录中升级一级,并在(项目的)根文件夹中运行下一个命令

    php/宾/作曲家。药物更新