Symfony 针对不同的环境(产品、测试、开发)使用不同的学说夹具

Symfony using different doctrine fixture for different environments (prod, test, dev)

您好,我有一个关于使用 dataFixtures 的问题,我想在生产、开发、测试环境中使用固定装置。我尝试使用 --fixtures 选项,但它是一个未找到的选项。 如何使用我想要的文件在命令行上加载我的灯具?

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

我有固定装置

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

不幸的是,--fixtures 选项已在 DoctrineFixturesBundle 3.0 中删除,问题将通过使用“集合”的不同 approach 来解决。该解决方案似乎已实施但尚未合并到 DoctrineFixturesBundle master 中。

我建议当时耐心点。

EDIT: How to use environments to overcome this problem:

正如您在评论中所问,您确实可以像这样使用 env 选项来解决这个问题:

首先你应该创建一个抽象的 Fixture class 它应该存在于你的 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();
}

然后你应该为每个环境(prod、test、dev)用你的 class 扩展这个抽象 Fixture class 像这样(仅针对 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'];
    }
 }

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

使用此设置,每次您 运行 带有 --env 选项的 doctrine:fixtures:load 命令时,所有 Fixture classes 将首先加载(AbstractFixture class) 但只有在 getEnvironments() 中设置了相应环境的 Fixture classes 才会真正执行。

Symfony 在 fixture bundle 中引入了 "Group" 的概念。例如,您现在可以按环境对灯具进行分组。

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