web-dev-qa-db-ja.com

Symfony 3.4.0ロードするフィクスチャサービスが見つかりませんでした

私はSymfony 3.4.0を使用していますが、フィクスチャをロードしようとしています:

php bin/console doctrine:fixtures:load

データの作成中にエラーが発生しました。何が問題ですか?

enter image description here

21
Alexander

このコマンドは、doctrine.fixture.ormでタグ付けされたすべてのサービスを探します。
この問題を修正するには2つの方法があります。

最初のもの:ORMFixtureInterfaceを実装するクラスは、このタグで自動的に登録されます。

<?php

namespace AppBundle\DataFixtures\ORM;


use Doctrine\Bundle\FixturesBundle\ORMFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;

class LoadFixtures implements ORMFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        #your code
    }
}

2番目:doctrine.fixture.ormの設定でsevice.ymlDataFixturesに手動でタグ付けする必要があります。

services:
    ...

    # makes classes in src/AppBundle/DataFixtures available to be used as services
    # and have a tag that allows actions to type-hint services
    AppBundle\DataFixtures\:
        resource: '../../src/AppBundle/DataFixtures'
        tags: ['doctrine.fixture.orm']
36
GuRu

@Alexanderのソリューションを試しましたが、うまくいきません。

タグサービスをクラスに追加することで同じ問題を解決しました Symfony docservices.ymlファイルバンドル:

BlogBundle/Resources/config/services.yml

Services:
...
# Fixtures services
    BlogBundle\DataFixtures\ORM\PostFixture:
        tags: [doctrine.fixture.orm]
...

僕の BlogBundle/DataFixtures/ORM/PostFixture.phpクラス:

...
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
...

class PostFixture implements FixtureInterface
{
public function load(ObjectManager $manager)
    {
...
}
}

ソースのインスピレーション: Synfony doc-> Service container-> The autoconfigure Option

それが代替ソリューションになることを願っています

8
zatamine

再利用可能なバンドルの例。

src/Acme/Bundle/UserBundle/DataFixtures/ORM/DataFixtures.php

<?php 
namespace Acme\Bundle\UserBundle\DataFixtures\ORM;

use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;

class DataFixtures extends Fixture
{
    /**
     * Load data fixtures with the passed EntityManager
     *
     * @param ObjectManager $manager
     */
    public function load(ObjectManager $manager)
    {
       #your code
    }
}

app/config/services.ymlに

Acme\Bundle\UserBundle\DataFixtures\:
     resource: '../../src/Acme/Bundle/UserBundle/DataFixtures/'

フィクスチャデータを追加します。

php bin/console doctrine:fixtures:load --append
3
mshv

〜/ dev/domain.lan/src/ProductBundle/DataFixtures/ORM/ProductF‌ ixture.php

<?php

namespace ProductBundle\DataFixtures\ORM;

use Doctrine\Bundle\FixturesBundle\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use ProductBundle\Entity\Product;

class ProductFixture implements FixtureInterface
{

    public function load(ObjectManager $manager)
    {
       // create 20 products! Bam!
       for ($i = 0; $i < 20; $i++) {
           $product = new Product();
           $product->setName('Product name' . $i);
           $manager->persist($product);
       }

       $manager->flush();
    }
}

サービスを追加する必要があった問題は解決されました:(app/config/services.yml)

services:
    # Product service
    ProductBundle\:
        resource: '../../src/ProductBundle/*'
        exclude: '../../src/ProductBundle/{Entity,Repository,Tests}'
2
Alexander

4.0.1では、SymfonyにDataFixturesフォルダーを表示するサービス構成を実装する必要があります。

config/services.yamlで

services:

    ...

    App\DataFixtures\:
        resource: '../src/DataFixtures'
        tags: [doctrine.fixture.orm]

クラスがIMPLEMENTS FixtureInterfaceであり、この構成がない場合、EXTENDS Fixtureの場合

2
Wishmaster

doctrine\Bundle\FixturesBundle\Fixtureを使用します

クラスProductFixtureはFixtureを拡張しFixtureInterfaceを実装します

ドキュメントを参照してください: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html

1
Ivor Szaniszló

上記のコメントを読んだ後、@ GuRuの答えの中に解決策が見つかりました:

"2つ目:doctrine.fixture.ormをsevice.yml設定のDataFixturesに手動でタグ付けする必要があります"。

次に、フィクスチャクラスにORMFixtureInterfaceを実装します。

。実際、それを解決するには追加の設定をservices.yml内に追加する必要があります。重要なことは、symfonyのバージョン〜3.4でこの問題に気づいたことです。

宜しくお願いします

0
Diskary

長い研究の後、解決策を見つけました。この作品:

  • doctrine/doctrine-fixtures-bundle:^ 3.0、
  • Symfony ^ 3.3

最初

  • フィクスチャを定義します。
<?php
namespace Where\MyFixtureBundle\FileFolder\IsLocated;

use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Nao\UserBundle\Entity\User;

class LoadData implements FixtureInterface
{
    /**
     * Load data fixtures with the passed EntityManager
     *
     * @param ObjectManager $manager
     */
    public function load(ObjectManager $manager){
        $object = new Entity();
        $object->setFoo(bar)
        ...

        $manager->persist($object);

        $manager->flush();
    }
}

次に、bundleのservice.yml fileでサービスを定義するか、直接"app/config/service .yml "(推奨されません)

# Fixtures service
your_service.name:
    class: Full\Namespce\With\TheClassFixtureName
    tags: [doctrine.fixture.orm] <-- important

忘れないでください、ただ次のことを確認してください

composer du -o or composer dump-autoload -o

今すぐコマンドを実行して、データフィクスチャをロードしてみてください。

0
Spartacvs1

また、app/AppKernel.phpを更新する必要があり、バンドル配列に次を追加しました。

new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle()
0
bananaCute