Symfony3 ClassNotFoundException Unraveled
ユーザーは、バンドルを作成した後、新しい Symfony3 プロジェクトに着手しているときに、恐ろしい ClassNotFoundException に遭遇しました。詳細を詳しく説明します:
残念なことに、アクセスしようとしました127.0.0.1:8000 では、悪名高いエラー メッセージ「ClassNotFoundException: 名前空間 "PaulArtBundle" からクラス "PaulArtBundle" をロードしようとしました。
原因の解明
ユーザーはコードを注意深く確認し、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 の autoload セクションの更新に失敗し、新しいファイルの追加を怠ったことが判明しました。 namespace.
解決策
問題を修正するために、ユーザーは、composer.json を手動で編集し、autload セクションを更新しました。
# composer.json "autoload": { "psr-4": { "AppBundle\": "src/AppBundle", "Paul\": "src/Paul" }, "classmap": [ "app/AppKernel.php", "app/AppCache.php" ] }
実行コンポーザーダンプオートロードを実行してサーバーを再起動すると、問題が解決されましたClassNotFoundException.
追加メモ
ユーザーは、新しいバンドルがデフォルト ルート (/) をオーバーライドするため、予期しない "Hello World" 挨拶が行われることに気付きました。
興味深い洞察
以前Symfony 3.2 では、composer.json 設定は名前空間のない PSR-4 マッピングを想定していました。ただし、Symfony 3.2 では、名前空間を明示的に指定する、より明示的なアプローチが導入されました。この変化がこの問題の原因となっている可能性があります。
結論
generate:bundle コマンドは歴史的にバンドルを作成する簡単な方法でしたが、最近の Symfony の自動読み込み設定の変更により、シームレスなバンドル統合を実現するには手動介入が必要です。
以上がSymfony3 がバンドル生成後に ClassNotFoundException をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。