web-dev-qa-db-ja.com

バンドル作成後のSymfony3 ClassNotFoundException

Symfonyで新しい3.3プロジェクトを開始したかったので、通常どおり開始しました。

1.)新しいプロジェクトの作成:symfony new ArtProject

2.)新しいバンドルの作成:php app/console generate:bundle(Paul/ArtBundle、yml、src /)

次に、ローカルサーバーを実行し、127.0.0.1:8000を開くと、次の美しいメッセージが表示されます。

(1/1)ClassNotFoundException

名前空間「Paul\ArtBundle」からクラス「PaulArtBundle」をロードしようとしました。別の名前空間の「use」ステートメントを忘れましたか? AppKernel.php(19行目)

これは奇妙なことであり、これがなぜこれまでに発生したのか私は理解していません。バンドルを作成する前にエラーはありませんでした。 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
{
}

何が起こっているのでしょうか?何も変更せず、これらのコマンドを実行しただけです。

30
pguetschow

次を使用して、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

サーバーを再起動します(たぶん)。これにより、バンドルクラスが見つからないという問題が修正されます。

Generate:bundleコマンドを使用したことがないのは、標準がすべてをAppBundleの下に置くことだったので、これがどれくらいの期間「壊れた」かわからないからです。しかし、先週の少なくとも3つの質問は、それが最近のものだったことを示しています。

ちなみに、ブラウザを更新すると、「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は、すべてを再び素晴らしいものにするはずです。

68
Cerad

複数のプロジェクトでの使用(独自の名前空間を使用)のバンドルを生成する場合、次のようにcomposer.jsonに追加する必要があります。

バンドル名がCompanyFooBundleで名前空間がCompany\Bundle\FooBundleであると仮定すると、composer autoloadセクションは次のようになります。

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

これは私のために働いています:

バンドルを生成します

./console generate:bundle

そして、いつものようにステップに従ってください。今、composer.jsonファイルで必要なことを次の行で行います。

"AppBundle\\": "src/AppBundle"

と置換する "": "src/"またはバンドルを追加します。例:"BackendBundle\\": "src/BackendBundle"

ここに新しい部分があります

  1. Binディレクトリにcomposerをインストールし、 https://getcomposer.org/download/ からステップをコピーして貼り付けます

  2. プロジェクトディレクトリのレベルを上げ、ルートフォルダー(プロジェクト)で次のコマンドを実行します

php ./bin/composer.pharアップデート

0
Zahit Rios