私はSymfony 3.4.0を使用していますが、フィクスチャをロードしようとしています:
php bin/console doctrine:fixtures:load
データの作成中にエラーが発生しました。何が問題ですか?
このコマンドは、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.yml
をDataFixtures
に手動でタグ付けする必要があります。
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']
@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
それが代替ソリューションになることを願っています
再利用可能なバンドルの例。
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
〜/ 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}'
4.0.1では、SymfonyにDataFixturesフォルダーを表示するサービス構成を実装する必要があります。
config/services.yamlで
services:
...
App\DataFixtures\:
resource: '../src/DataFixtures'
tags: [doctrine.fixture.orm]
クラスがIMPLEMENTS FixtureInterfaceであり、この構成がない場合、EXTENDS Fixtureの場合
doctrine\Bundle\FixturesBundle\Fixtureを使用します
クラスProductFixtureはFixtureを拡張しFixtureInterfaceを実装します
ドキュメントを参照してください: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html
上記のコメントを読んだ後、@ GuRuの答えの中に解決策が見つかりました:
"2つ目:doctrine.fixture.ormをsevice.yml設定のDataFixturesに手動でタグ付けする必要があります"。
次に、フィクスチャクラスにORMFixtureInterfaceを実装します。
。実際、それを解決するには追加の設定をservices.yml内に追加する必要があります。重要なことは、symfonyのバージョン〜3.4でこの問題に気づいたことです。
宜しくお願いします
長い研究の後、解決策を見つけました。この作品:
- 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
今すぐコマンドを実行して、データフィクスチャをロードしてみてください。
また、app/AppKernel.phpを更新する必要があり、バンドル配列に次を追加しました。
new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle()