Symfony 3.4.0 Не удалось найти ни одной службы фикстуры для загрузки

Я использую Symfony 3.4.0, я пытаюсь загрузить приборы с:

php bin/console doctrine:fixtures:load

Произошла ошибка при создании данных, что не так?

11 ответов

Эта команда ищет все службы, отмеченные doctrine.fixture.orm,
Есть два способа решить эту проблему.

Первый: любой класс, который реализует 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
    }
}

Второй: вам нужно вручную пометить doctrine.fixture.orm в DataFixtures в 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']

Я попробовал @ решение Александра, но оно не работает для меня.

Я решил ту же проблему, добавив службу тегов в класс, Symfony doc на services.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 -> Сервисный контейнер -> Параметр автоконфигурации

Надеюсь, что это будет альтернативным решением

В 4.0.1 я должен реализовать конфигурацию сервиса, чтобы показать Symfony мою папку DataFixtures:

в config/services.yaml

services:

    ...

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

если мой класс IMPLEMENTS FixtureInterface и без этого конфига, если это EXTENDS Fixture

Пример многоразового использования.

SRC /Acme/Bundle/UserBundle/DataFixtures/ ОРМ /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/ ОРМ /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}'

После долгих исследований нашел решение. Эта работа с:

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

Затем определите службу в файле service.yml пакета или непосредственно в "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

Попробуйте выполнить команду сейчас, чтобы загрузить данные.

Используйте Doctrine\Bundle\FixturesBundle\Fixture

Класс ProductFixture расширяет Fixture реализует FixtureInterface

см. документацию: http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html

Я прыгаю сюда через несколько лет, чтобы задокументировать для себя смешанное решение, которое я нашел в этой теме.

Я столкнулся с той же проблемой и нашел решение, используя несколько ответов, и я надеюсь, что это поможет.

Это был мой код:

      namespace App\DataFixtures;

use App\Entity\Book;
use App\Factory\{BookFactory, UserFactory};
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class AppFixtures extends Fixture
{
    public function load(ObjectManager $manager): void
    {
        UserFactory::new()->createOne([
            'email' => 'user2@user.hr',
            'roles' => ['ROLE_ADMIN']
        ]);

        UserFactory::new()->createOne([
            'email' => 'user3@user.hr',
            'roles' => ['ROLE_USER']
        ]);

        BookFactory::new()->createMany(25);

        $manager->flush();
    }
}

поэтому я заменил расширенный Fixture ORMFixtureInterface. Итак, новый код выглядит так:

      namespace App\DataFixtures;

use App\Entity\Book;
use App\Factory\{BookFactory, UserFactory};
use Doctrine\Bundle\FixturesBundle\ORMFixtureInterface;
use Doctrine\Persistence\ObjectManager;

class AppFixtures implements ORMFixtureInterface
{
    public function load(ObjectManager $manager): void
    {
        UserFactory::new()->createOne([
            'email' => 'user2@user.hr',
            'roles' => ['ROLE_ADMIN']
        ]);

        UserFactory::new()->createOne([
            'email' => 'user3@user.hr',
            'roles' => ['ROLE_USER']
        ]);

        BookFactory::new()->createMany(25);

        $manager->flush();
    }
}

затем я пошел в services.yml и вставил это:

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

поэтому файл services.yml выглядит так:

      services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'
    App\DataFixtures\:
        resource: '%kernel.project_dir%/src/DataFixtures'
        tags: ['doctrine.fixture.orm']

    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones

а затем, как предложил @Spartacvs1, в вашем терминале выполните это

      composer dump-autoload -o

Прочитав комментарий выше, я нашел решение в ответе @GuRu:

Msgstr " Второй вариант: вам нужно вручную пометить doctrine.fixture.orm для DataFixtures в конфигурации sevice.yml ".

Затем реализует ORMFixtureInterface в вашем классе приборов.

, на самом деле, мы должны добавить дополнительную конфигурацию внутри services.yml, чтобы решить эту проблему. Важно знать, я заметил эту проблему в версии ~3.4 Symfony.

С наилучшими пожеланиями

Мне также пришлось обновить app/AppKernel.php и добавить следующий массив bundles:

new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle()

Я хотел бы дать некоторый контекст проблемы, поскольку существующие ответы помогли мне, но не решили мой конкретный случай.

Поиск классов зависит от конфигурации внедрения службы:

      # app/config/services.yml

###
services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  DataFixtures\My\MyFixtures:
 
###
services:
  _defaults:
    autowire: true
    autoconfigure: false
    public: false

  my_fixtures:
    class: DataFixtures\My\MyFixtures
    tags:
      - doctrine.fixture.orm
    
###
services:
  _defaults:
    autowire: false
    autoconfigure: true
    public: false

  my_fixtures:
    class: DataFixtures\My\MyFixtures
    arguments:
      - '@fos_user.util.password_updater'

###
services:
  _defaults:
    autowire: false
    autoconfigure: false
    public: false

  my_fixtures:
    class: DataFixtures\My\MyFixtures
    tags:
      - doctrine.fixture.orm
    arguments:
      - '@fos_user.util.password_updater'

Для данного класса:

      # fixtures/My/MyFixtures.php
<?php
declare(strict_types=1);

namespace DataFixtures\My;

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

use FOS\UserBundle\Model\User;

class MyFixtures extends Fixture
{
    public function __construct(PasswordUpdaterInterface $passwordUpdater)
    {
        $this->passwordUpdater = $passwordUpdater;
    }

    public function load(ObjectManager $om): void
    {
        $user = new User;
        $user->setUsername('toto');
        $user->setPlainPassword('tata');
        $this->passwordUpdater->hashPassword($user);
        $user->setEmail('toto@lupusmic.org');
        $user->setEnabled(true);

        $om->persist($user);
        $om->flush();
    }

    private $passwordUpdater;
    private $om;
}

The composer.json:

      # composer.json
{
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests",
            "DataFixtures\\": "fixtures"
        }
    },
}

Загрузка в AppKernel:

      # app/AppKernel.php
public function registerBundles()
{
    $bundles = [];
    // ...

    // isTestEnvironement is a custom method to determine if `--env=test` given on CLI
    if ($this->isTestEnvironement()) {

        $bundles[] = new
            Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle;
    }
    
    // ...
    return $bundles;
}
Другие вопросы по тегам