【问题标题】:Symfony3 ClassNotFoundException after bundle creation创建捆绑包后的 Symfony3 ClassNotFoundException
【发布时间】:2017-07-06 10:52:20
【问题描述】:

我想在 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
{
}

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

【问题讨论】:

  • 检查 AppKernel.php 是否正确?
  • @SamJanssens 是的,我也可以从内核跳转到 IDE 中的 php 文件
  • 你注册好新的Bundle@Appkernel.php文件了吗?
  • 好吧,显然某处发生了命名空间问题,但在哪里......
  • 似乎对这些问题一无所知。检查 composer.json 文件的自动加载部分:stackoverflow.com/questions/44928982/… 最新版本可能有些问题。

标签: php symfony exception


【解决方案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 下以来,我已经有一段时间没有使用 generate: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 应该让一切再次变得美好。

【讨论】:

  • 是的,工作,重新启动服务器后。塔恩克斯 :)
  • 那里的工作很棒。感谢你的回答。花了好几天的时间来对抗这个。
  • 我刚刚发布了这个问题stackoverflow.com/questions/45151067/…,你标记为重复,是的,这个问题非常相似,只是我从 2.8.9 到 2.8.24(其中 psr- 4 条目已经不同)并且按照此处的指示执行了操作,除了 composer dumpautoload 行,正如我在问题中提到的那样,这对我来说不在桌面上,你能指出一个解决方法吗,thanx
  • 谢谢,你让我开心!
  • @MiracleJohnson - 如果需要,您可以将 psr4 行改回 { "": "src/" }。性能略有下降,但不足以引起注意。
【解决方案2】:

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

假设你的包名是CompanyFooBundle,命名空间为Company\Bundle\FooBundle,那么作曲家自动加载部分应该如下所示:

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

【讨论】:

  • 感谢“Company\\Bundle\\FooBundle\\”,我的错误是:“CompanyBundleFooBundle\\”
【解决方案3】:

这对我有用:

使用

生成您的 Bundle

./console generate:bundle

然后像往常一样按照这些步骤,现在,在你的 composer.json 文件中做你想做的事

"AppBundle\\": "src/AppBundle"

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

这是新的部分

  1. 在你的bin目录下安装composer,复制粘贴https://getcomposer.org/download/中的步骤

  2. 在您的项目目录中上一层,然后在(项目的)根文件夹中运行下一个命令

php ./bin/composer.phar 更新

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-13
      • 2012-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      相关资源
      最近更新 更多