创建包后Symfony3 ClassNotFoundException

时间:2017-07-06 10:52:20

标签: php symfony exception

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

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

2。)创建一个新的Bundle:php app/console generate:bundle(Paul / ArtBundle,yml,src /)

然后我运行本地服务器,当我打开127.0.0.1:8000时,我收到了这条美丽的信息:

  

(1/1)ClassNotFoundException

     

尝试从命名空间加载类“PaulArtBundle”   “保罗\ ArtBundle”。你忘记了另一个人的“使用”陈述吗?   命名空间?在AppKernel.php(第19行)

这很奇怪,我还没弄清楚到目前为止这种情况发生的原因。在创建Bundle之前,没有错误;我看到了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
{
}

有什么想法吗?我没有更改任何东西,我只运行了这些命令。

4 个答案:

答案 0 :(得分:65)

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

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

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

顺便说一句,当我刷新浏览器时,我得到了#34; Hello World&#34;这让我有些失望。原来这个新的包覆盖了/ route,这也很特别。

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

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

你可以随时改变它,虽然我认为拼出单个命名空间可能会更好&#34;。不确定。

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

看起来维护人员比打破现有命令更有利于提高速度。那好吧。 Symfony Flex应该让一切变得更好。

答案 1 :(得分:3)

如果您为多个项目中的用法生成(具有自己的命名空间),则需要将其添加到mvn clean中,如下所示:

假设您的包名称为composer.json,其名称空间为CompanyFooBundle,那么composer autoload部分应如下所示:

Company\Bundle\FooBundle

答案 2 :(得分:0)

这对我有用:

使用

生成您的Bundle
  

./ console generate:bundle

按照以往的步骤,现在,使用行

在composer.json文件中执行您想要的操作
"AppBundle\\": "src/AppBundle"

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

以下是新篇幅

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

  2. 中的步骤
  3. 在项目目录中的某个级别上,在(根据项目的)根文件夹中运行下一个命令

  4. php ./bin/composer.phar update

答案 3 :(得分:0)

删除vendor目录并再次运行composer install帮助我解决了同样的问题。