web-dev-qa-db-fra.com

Symfony 3.4.0 Impossible de trouver un service de fixation à charger

J'utilise Symfony 3.4.0, j'essaie de charger des appareils avec:

php bin/console doctrine:fixtures:load

Une erreur est survenue lors de la création des données, qu'est-ce qui ne va pas?

 enter image description here

19
Alexander

Cette commande recherche tous les services marqués avec doctrine.fixture.orm.
Il existe deux façons de résoudre ce problème.

La première: toute classe implémentant ORMFixtureInterface sera automatiquement enregistrée avec cette balise.

<?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
    }
}

Deuxième: Vous devez manuellement tagger doctrine.fixture.orm à DataFixtures dans la configuration sevice.yml.

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']
31
GuRu

J'ai essayé la solution de @ Alexander mais ça ne marche pas pour moi.

J'avais résolu le même problème en ajoutant le service de balises à la classe, doc Symfony sur le groupe de fichiers services.yml:

BlogBundle/Resources/config/services.yml

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

Ma classe BlogBundle/DataFixtures/ORM/PostFixture.php

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

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

Source Inspiration: Documentation Synfony -> Conteneur de services -> Option de configuration automatique

J'espère que ça va être une solution alternative

7
zatamine

Exemple pour un paquet réutilisable.

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
    }
}

dans app/config/services.yml 

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

ajoutez vos données de fixtures:

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();
    }
}

Le problème est résolu il était nécessaire d'ajouter un service: (app/config/services.yml)

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

utilisez Doctrine\Bundle\FixturesBundle\Fixture 

classe ProductFixture étend Fixture implémente FixtureInterface

voir documentation: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html

1
Ivor Szaniszló

Dans 4.0.1, je dois implémenter la configuration du service pour afficher mon dossier DataFixtures dans Symfony

dans config/services.yaml

services:

    ...

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

si ma classe IMPLEMENTS FixtureInterface et sans cette configuration si elle est EXTENDS Fixture

1
Wishmaster

Après avoir lu le commentaire ci-dessus, j'ai trouvé une solution dans la réponse de @GuRu:

" Deuxième question: vous devez associer manuellement doctrine.fixture.orm à DataFixtures dans la configuration sevice.yml ". 

Puis implémente ORMFixtureInterface dans votre classe de fixtures.

. en fait, nous devons ajouter une configuration supplémentaire à l'intérieur de services.yml pour le résoudre .. Il est important de savoir que je remarque ce problème dans la version ~ 3.4 de symfony.

Sincères salutations

0
Diskary

Après de longues recherches, trouvé une solution. Ce travail avec:

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

Premier

  • Définissez votre luminaire.
<?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();
    }
}

Ensuite, définissez un service dans le fichier service.yml du bundle ou directement dans "app/config/service.yml" (non recommandé)

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

N'oubliez pas, juste pour être sûr de ce qui suit

composer du -o or composer dump-autoload -o

Essayez d'exécuter votre commande maintenant pour charger vos données.

0
Spartacvs1

Je devais également mettre à jour le fichier app/AppKernel.php et ajouter le tableau suivant:

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