Symfony针对不同环境(产品,测试,开发人员)使用了不同的原理夹具

时间:2018-09-24 10:28:46

标签: symfony doctrine-orm fixtures

嗨,我对使用dataFixtures有疑问,我想将夹具用于环境prod,dev,test。我尝试使用--fixtures选项,但找不到该选项。 如何在命令行中将所需的文件加载到我的灯具中?

是否可以使用--env命令的doctrine:fixtures:load选项来做到这一点?

我有固定装置

  • App / DataFixtures / Prod
  • App / DataFixtures / Dev
  • 应用/数据修复/测试

我正在使用symfony 3.4 谢谢您的帮助

2 个答案:

答案 0 :(得分:1)

不幸的是,在DoctrineFixturesBundle 3.0中,--fixtures选项已被删除,该问题将通过使用不同的approach使用“集合”来解决。该解决方案似乎已经实施,但尚未与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类,并添加一个类(仅针对产品显示示例):

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'];
    }
 }

这些ProdFixtureTestFixtureDevFixture等类也应位于您的DataFixtures目录中。

使用此设置,每次您使用doctrine:fixtures:load选项运行--env命令时,将首先加载所有Fixture类(AbstractFixture类除外),但是只有在getEnvironments( )会真正执行。

答案 1 :(得分:0)

Symfony在灯具组合中引入了“组”的概念。例如,您现在可以按环境对设备进行分组。

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