Symfony использует разные доктрины для разных сред (prod, test, dev) - PullRequest
0 голосов
/ 24 сентября 2018

Привет У меня есть вопрос с использованием dataFixtures, я хочу использовать фикстуры для сред prod, dev, test.Я попытался использовать параметр --fixtures, но он не найден.Как я могу загрузить свои приборы в командной строке нужным файлом?

Можно ли это сделать, используя параметр --env команды doctrine:fixtures:load?

У меня есть приборы на

  • Приложение / DataFixtures / Prod
  • Приложение / DataFixtures / Dev
  • Приложение / DataFixtures / Test

Я использую Symfony 3.4Спасибо за вашу помощь

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Symfony ввел понятие «группа» в комплекте приборов.Теперь вы можете сгруппировать свои приборы, например, по среде.

https://symfony.com/blog/new-in-fixturesbundle-group-your-fixtures

0 голосов
/ 24 сентября 2018

К сожалению, опция --fixtures была удалена в DoctrineFixturesBundle 3.0, проблема собирается быть решена с помощью другого подхода с использованием «наборов».Похоже, что решение было реализовано, но еще не объединено в мастере DoctrineFixturesBundle.

Я бы посоветовал немного терпения в то время.

РЕДАКТИРОВАТЬ : какЧтобы использовать эту среду для преодоления этой проблемы:

Как было сказано в вашем комментарии, вы действительно можете использовать опцию env для решения этой проблемы следующим образом:

Сначала вы должны создать абстрактный Fixture.класс, который должен находиться в вашем каталоге DataFixtures, с вложенным контейнером, чтобы вы могли получить текущую среду из ядра:

namespace App\DataFixtures;

use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

abstract class AbstractFixture implements ContainerAwareInterface, FixtureInterface
{
    protected $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function load(ObjectManager $manager)
    {

        $kernel = $this->container->get('kernel');

        if (in_array($kernel->getEnvironment(), $this->getEnvironments())) {
            $this->doLoad($manager);
        }
    }

    abstract protected function doLoad(ObjectManager $manager);

    abstract protected function getEnvironments();
}

Затем вы должны расширить этот абстрактный класс Fixture с помощью своего класса для каждой среды (prod, test, dev) вот так (пример показан только для prod):

namespace App\DataFixtures;

use Doctrine\Common\Persistence\ObjectManager;

class ProdFixture extends AbstractFixture
{

    protected function doLoad(ObjectManager $manager)
    {
        // load what you need to load for prod environment 
    }

    protected function getEnvironments()
    {
        return ['prod'];
    }
 }

Эти классы ProdFixture, TestFixture, DevFixture и т. д. также должны находиться в каталоге DataFixtures.

При такой настройке каждый раз, когда вы запускаете команду doctrine:fixtures:load с параметром --env, все классы Fixture будут изначально загружаться (кроме класса AbstractFixture) bно только классы Fixture с соответствующей средой, установленной в getEnvironments (), будут действительно выполнены.

...