Symfony 针对不同的环境(产品、测试、开发)使用不同的学说夹具
Symfony using different doctrine fixture for different environments (prod, test, dev)
您好,我有一个关于使用 dataFixtures 的问题,我想在生产、开发、测试环境中使用固定装置。我尝试使用 --fixtures
选项,但它是一个未找到的选项。
如何使用我想要的文件在命令行上加载我的灯具?
是否可以使用 doctrine:fixtures:load
命令的 --env
选项来做到这一点?
我有固定装置
- App/DataFixtures/Prod
- App/DataFixtures/Dev
- App/DataFixtures/Test
我正在使用 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'];
}
}
这些 ProdFixture
、TestFixture
、DevFixture
等 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
您好,我有一个关于使用 dataFixtures 的问题,我想在生产、开发、测试环境中使用固定装置。我尝试使用 --fixtures
选项,但它是一个未找到的选项。
如何使用我想要的文件在命令行上加载我的灯具?
是否可以使用 doctrine:fixtures:load
命令的 --env
选项来做到这一点?
我有固定装置
- App/DataFixtures/Prod
- App/DataFixtures/Dev
- App/DataFixtures/Test
我正在使用 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'];
}
}
这些 ProdFixture
、TestFixture
、DevFixture
等 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