首页 >后端开发 >php教程 >为什么 Symfony3 在生成 Bundle 后会抛出 ClassNotFoundException?

为什么 Symfony3 在生成 Bundle 后会抛出 ClassNotFoundException?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-22 09:31:111048浏览

Why Does Symfony3 Throw a ClassNotFoundException After Generating a Bundle?

Symfony3 ClassNotFoundException Unraveled

用户在创建包后开始新的 Symfony3 项目时遇到了可怕的 ClassNotFoundException。深入了解细节:

  1. 一个新的 Symfony 项目已通过 symfony new ArtProject 启动。
  2. 使用 php app/consolegenerate:bundle Paul/ArtBundle, yml 生成了一个新包。 , src/.

令他们沮丧的是,尝试访问127.0.0.1:8000 导致臭名昭著的错误消息:“ClassNotFoundException:尝试从命名空间“PaulArtBundle”加载类“PaulArtBundle”。

揭开原因

The用户仔细检查了代码并注意到 AppKernel.php 包含以下内容声明:

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

PaulArtBundle 被定义为:

<?php

namespace Paul\ArtBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class PaulArtBundle extends Bundle
{
}

发现了缺失的环节

经过深思熟虑,发现了该generate:bundle命令无法更新composer.json的autload部分,忽略添加新的

解决方案

为了纠正该问题,用户手动编辑了composer.json并更新了autload部分:

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

执行Composer dumpautoload 并重新启动服务器解决了ClassNotFoundException。

附加说明

用户观察到新包覆盖了默认路由 (/),因此出现了意外的“Hello World”问候语。

有趣的见解

之前Symfony 3.2 中,composer.json 配置采用了无命名空间的 PSR-4 映射。然而,Symfony 3.2 引入了一种更明确的方法,明确指定命名空间。这种转变可能导致了这个问题。

结论

虽然generate:bundle命令历来是创建bundle的简单方法,但Symfony的自动加载配置最近发生了变化需要手动干预以确保无缝捆绑集成。

以上是为什么 Symfony3 在生成 Bundle 后会抛出 ClassNotFoundException?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn