it-swarm.com.de

Symfony 3.4.0 Es konnten keine zu ladenden Fixture-Services gefunden werden

Ich verwende Symfony 3.4.0 und versuche, Fixtures zu laden mit:

php bin/console doctrine:fixtures:load

Beim Erstellen der Daten ist ein Fehler aufgetreten. Was ist los?

 enter image description here

19
Alexander

Dieser Befehl sucht nach allen mit doctrine.fixture.orm gekennzeichneten Diensten.
Es gibt zwei Möglichkeiten, dieses Problem zu beheben.

Erste: Jede Klasse, die ORMFixtureInterface implementiert, wird automatisch mit diesem Tag registriert.

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

Zweite: Sie müssen doctrine.fixture.orm manuell in DataFixtures in sevice.yml-Konfiguration markieren.

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

Ich habe @ Alexanders Lösung ausprobiert, aber es funktioniert nicht für mich.

Ich hatte das gleiche Problem durch Hinzufügen des Tag-Services zur Klasse Symfony doc im services.yml-Dateibündel behoben:

BlogBundle/Resources/config/services.yml

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

Meine BlogBundle/DataFixtures/ORM/PostFixture.php-Klasse: 

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

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

Quelleninspiration: Synfony-Dokument -> Dienstcontainer -> Die Option zur automatischen Konfiguration

Hoffe es wird eine alternative Lösung

7
zatamine

Beispiel für ein wiederverwendbares Bündel.

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

in app/config/services.yml 

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

füge deine Fixture-Daten hinzu:

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

Das Problem ist gelöst. Es war notwendig, einen Dienst hinzuzufügen: (app/config/services.yml)

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

verwenden Sie Doctrine\Bundle\FixturesBundle\Fixture 

die Klasse ProductFixture erweitert Fixture implementiert FixtureInterface

siehe Dokumentation: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html

1
Ivor Szaniszló

In 4.0.1 muss ich die Servicekonfiguration implementieren, um den Symfony-Ordner "DataFixtures" anzuzeigen:

in config/services.yaml

services:

    ...

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

wenn meine Klasse IMPLEMENTS FixtureInterface und ohne diese config wenn EXTENDS Fixture ist

1
Wishmaster

Nachdem ich den obigen Kommentar gelesen hatte, fand ich eine Lösung in @GuRus Antwort:

" Zweites: Sie müssen doctrine.fixture.orm in DataFixtures manuell in sevice.yml configuration taggen. 

Implementiert dann ORMFixtureInterface in Ihrer Fixtures-Klasse.

. In der Tat müssen wir zusätzliche Services in services.yml hinzufügen, um das Problem zu lösen.

Mit bestem Gruß

0
Diskary

Nach langen Recherchen fand sich eine Lösung. Diese Arbeit mit:

  • doktrin/Doktrin-Fixture-Bundle: ^ 3.0,
  • Symfony ^ 3.3

Zuerst

  • Definieren Sie Ihr Gerät.
<?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();
    }
}

Definieren Sie als Nächstes einen Dienst in der service.yml-Dateides Bundlesoder direkt in. "app/config/service.yml" (nicht empfohlen)

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

Vergessen Sie nicht, nur um sicher zu sein, das Folgende

composer du -o or composer dump-autoload -o

Versuchen Sie, Ihren Befehl jetzt auszuführen, um Ihre Daten-Fixtures zu laden.

0
Spartacvs1

Ich musste auch die app/AppKernel.php aktualisieren und fügte Folgendes hinzu:

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