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

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

php bin/console doctrine:fixtures:load

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

введите описание изображения здесь


person Alexander    schedule 03.12.2017    source источник
comment
Где ваши приспособления? Какой каталог? Может показать код   -  person Smaïne    schedule 03.12.2017
comment
Ваши светильники должны быть расположены, например. в 1_   -  person baris1892    schedule 03.12.2017
comment
Патч: ~/dev/domain.lan/src/ProductBundle/DataFixtures/ORM/ProductFixture.php Корень веб-сайта: ~/dev/domain.lan/   -  person Alexander    schedule 03.12.2017
comment
Та же ошибка возникла в Symfony 3.4. В Symfony 3.3 все работает нормально.   -  person Alexander    schedule 17.02.2018


Ответы (9)


Эта команда ищет все службы с тегом 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']
person GuRu    schedule 01.01.2018
comment
Я потратил много времени, пытаясь зарегистрировать свой класс данных прибора. Итак, реализация этого интерфейса ORMFixtureInterface - сделала мой день :) Спасибо, сэр! - person kxko; 29.03.2018
comment
Symfony говорит то же самое! цитата: Если вы используете конфигурацию службы по умолчанию, любой класс, реализующий ORMFixtureInterface, будет автоматически зарегистрирован с этим тегом. symfony.com/doc/current/bundles/DoctrineFixturesBundle/ - person Muzafar Ali; 05.05.2018

Я попробовал решение @Alexander, но оно у меня не работает.

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

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

person zatamine    schedule 03.12.2017
comment
Это решение работает нормально. Я начал получать эту ошибку, когда обновил фикстуры доктрины с версии 2.4.1 до 3.0.2. - person Praveesh; 06.12.2017

Пример многоразового пакета.

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

в приложении/config/services.yml

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

добавьте данные ваших приборов:

php bin/console doctrine:fixtures:load --append
person mshv    schedule 10.01.2018

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

в config/services.yaml

services:

    ...

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

если мой класс РЕАЛИЗУЕТ FixtureInterface и без этого конфига если он РАСШИРЯЕТ Fixture

person Wishmaster    schedule 06.12.2017
comment
@Dimitry, лучше использовать этот resource: '%kernel.project_dir%/src/DataFixtures' - person Mick; 03.01.2018

~/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}'
person Alexander    schedule 03.12.2017
comment
Может быть, вы должны добавить его в файл пакета services.yml, например: ~/dev/domain.lan/src/ProductBundle/Resoueces/config/services.yml - person zatamine; 03.12.2017

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

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

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

person Ivor Szaniszló    schedule 03.12.2017

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

  • комплект доктрины/доктрины-фикстуры: ^3.0,
  • Симфония ^ 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

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

person Spartacvs1    schedule 08.01.2018

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

new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle()
person bananaCute    schedule 24.06.2018

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

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

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

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

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

person Diskary    schedule 29.09.2018
comment
Что нового несет этот ответ? Все, что вы сказали, уже сделано в ответе и в комментарии - person Vega; 29.09.2018