Я использую Symfony 3.4.0, я пытаюсь загрузить фикстуры с помощью:
php bin/console doctrine:fixtures:load
При создании данных произошла ошибка, что не так?
Я использую Symfony 3.4.0, я пытаюсь загрузить фикстуры с помощью:
php bin/console doctrine:fixtures:load
При создании данных произошла ошибка, что не так?
Эта команда ищет все службы с тегом 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']
Я попробовал решение @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 -> Сервисный контейнер -> Параметр автонастройки
Надеюсь, это будет альтернативное решение
Пример многоразового пакета.
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
В 4.0.1 мне нужно реализовать конфигурацию службы, чтобы показать Symfony мою папку DataFixtures:
в config/services.yaml
services:
...
App\DataFixtures\:
resource: '../src/DataFixtures'
tags: [doctrine.fixture.orm]
если мой класс РЕАЛИЗУЕТ FixtureInterface и без этого конфига если он РАСШИРЯЕТ Fixture
resource: '%kernel.project_dir%/src/DataFixtures'
- person Mick; 03.01.2018
~/dev/domain.lan/src/ProductBundle/DataFixtures/ORM/ProductFixture.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}'
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
После долгих поисков нашел решение. Эта работа с:
- комплект доктрины/доктрины-фикстуры: ^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
Попробуйте выполнить вашу команду сейчас для загрузки ваших приборов данных.
Мне также пришлось обновить app/AppKernel.php и добавить следующий массив пакетов:
new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle()
Прочитав комментарий выше, я нашел решение в ответе @GuRu:
«Второй: вам нужно вручную пометить доктрину.fixture.orm в DataFixtures в конфигурации sevice.yml».
Затем реализует ORMFixtureInterface в вашем классе приборов.
. на самом деле, мы должны добавить дополнительную конфигурацию в services.yml, чтобы решить эту проблему. Важно знать, я заметил эту проблему в версии 3.4 symfony.
С наилучшими пожеланиями