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

Symfony针对不同的环境(产品、测试、开发)使用不同的条令夹具,symfony,doctrine-orm,fixtures,Symfony,Doctrine Orm,Fixtures,您好,我有一个关于使用DataFixture的问题,我想在产品、开发和测试环境中使用Fixture。我尝试使用--fixtures选项,但未找到该选项。 如何在命令行上加载所需文件的装置 是否可以使用条令:装置:加载命令的--env选项执行此操作 我有固定装置 应用程序/数据装置/产品 App/DataFixtures/Dev 应用程序/数据装置/测试 我用的是symfony3.4 感谢您的帮助不幸的是,--fixtures选项在DoctrineFixturesBundle 3.0中已被删除

您好,我有一个关于使用DataFixture的问题,我想在产品、开发和测试环境中使用Fixture。我尝试使用
--fixtures
选项,但未找到该选项。 如何在命令行上加载所需文件的装置

是否可以使用
条令:装置:加载
命令的
--env
选项执行此操作

我有固定装置

  • 应用程序/数据装置/产品
  • App/DataFixtures/Dev
  • 应用程序/数据装置/测试
我用的是symfony3.4 感谢您的帮助

不幸的是,
--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();
}
然后,您应该为每个环境(prod、test、dev)扩展这个抽象Fixture类,如下所示(仅为prod显示的示例):

这些
ProdFixture
TestFixture
DevFixture
等类也应该存在于DataFixtures目录中

每次运行带有
--env
选项的
原则:fixtures:load
命令时,使用此设置,所有Fixture类最初都会加载(AbstractFixture类除外),但只有在getEnvironments()中设置了相应环境的Fixture类才会真正执行。

不幸的是,DoctrineFixturesBundle 3.0中的
--fixtures
选项已被删除,该问题将使用不同的“集合”解决。解决方案似乎已经实现,但尚未合并到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();
}
然后,您应该为每个环境(prod、test、dev)扩展这个抽象Fixture类,如下所示(仅为prod显示的示例):

这些
ProdFixture
TestFixture
DevFixture
等类也应该存在于DataFixtures目录中


每次使用
--env
选项运行
原则:fixtures:load
命令时,都会使用此设置,所有Fixture类最初都会加载(AbstractFixture类除外),但只有在getEnvironments()中设置了相应环境的Fixture类才会真正执行。

Symfony引入了“组”的概念在fixture包中。例如,现在可以按环境对装置进行分组


Symfony在fixture bundle中引入了“组”的概念。例如,现在可以按环境对装置进行分组


谢谢您的回答,我在选项列表中看到了--env,我不知道如何使用它,以及它是否是一个解决方案?出于这个原因,编辑了我的回答,解释了如何使用--env选项。我复制了相同的方法,但当我使用条令:fixtures:load--env=prod时,我出现了一个错误“条令:fixtures”中没有定义任何命令”命名空间。”如果我删除--env选项,命令会工作:(抱歉,我认为这是因为捆绑包是为appKernelA上的开发和测试注册的一个小问题:)在--env=dev中,它会加载DevFixture和ProdFixture ok,但我在开发文件中有一些引用,指向prod文件上的fixture($this->getReference())失败感谢您的回答,我在选项列表中看到了--env,我不知道如何使用它以及它是否是一个解决方案?出于这个原因,我编辑了我的答案来解释如何使用--env选项。我复制了相同的方法,但当我使用条令:fixtures:load--env=prod时,我出现了一个错误“条令:fixtures”命名空间中没有定义命令”如果我删除--env选项,命令work:(抱歉,我认为这是因为捆绑包是为appKernelA上的开发和测试注册的一个小问题:)在--env=dev中,它加载DevFixture和ProdFixture ok,但我在开发文件中有一些引用,指向prod文件上的fixture($this->getReference())失败