Symfony3 ClassNotFoundException Unraveled
用户在创建包后开始新的 Symfony3 项目时遇到了可怕的 ClassNotFoundException。深入了解细节:
令他们沮丧的是,尝试访问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中文网其他相关文章!