Symfony为不同的环境(生产,测试,开发)使用不同的学说装置



嗨,我有一个关于使用dataFixtures的问题,我想将Fixture用于环境生产,开发,测试。我尝试使用--fixtures选项,但找不到此选项。 如何在命令行上用我想要的文件加载我的灯具?

是否可以使用doctrine:fixtures:load命令的--env选项来执行此操作?

我有固定装置

  • 应用程序/数据夹具/产品
  • 应用/数据夹具/开发
  • 应用程序/数据夹具/测试

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

不幸的是,--fixtures选项已在 DoctrineFixturesBundle 3.0 中删除,该问题即将通过使用"集合"的不同方法解决。该解决方案似乎已经实现,但尚未合并到DoctrineFixturesBundle主控中。

我当时建议耐心等待。

编辑:如何使用环境来克服这个问题:

正如您的评论中所问的,您确实可以使用env选项来克服此问题,如下所示:

首先,您应该创建一个抽象的 Fixture 类,该类应该位于 DataFixtures 目录中,并注入容器,以便您可以从内核获取当前环境:

namespace AppDataFixtures;
use DoctrineCommonDataFixturesFixtureInterface;
use DoctrineCommonPersistenceObjectManager;
use SymfonyComponentDependencyInjectionContainerAwareInterface;
use SymfonyComponentDependencyInjectionContainerInterface;
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 显示(:

namespace AppDataFixtures;
use DoctrineCommonPersistenceObjectManager;
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 类最初都将加载(AbstractFixture 类除外(,但只有在 getEnvironments(( 中设置了相应环境的 Fixture 类才会真正执行。

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

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

最新更新