根据 Symfony 3 中的配置加载不同的数据夹具
Load different Data Fixtures depending on configuration in Symfony 3
目前我们正在为一些在线商店(以及未来可能的新商店)开发一组微服务。出于商业原因,我们将对同一软件进行不同的实施,因此每家商店都会询问自己的一个。
我需要根据实现在数据库上设置不同的初始数据包,这意味着每个数据夹具不同。
我正在寻找一种根据配置参数(company_name、company_slug...)加载正确装置的好方法。最好的方法是什么?
如果您正在使用 doctrine/doctrine-fixtures-bundle
,您可以在文件中使用参数 params.yml
,然后在容器的加载函数中获取它。像这样
//parameters.yml
parameters
config: "Cloud" //it can be anyelse
并在fixtures中加载文件
public function setContainer(ContainerInterface $container = null)
{
var_dump('getting container here');
$this->container = $container;
}
/**
* {@inheritDoc}
*/
public function load(ObjectManager $manager)
{
$config = $this->container->getParameter('config'); //"Cloud"
if($config == "Cloud"){
//Do something
}else{
//Do something else
}
}
我认为这是更好的方法,因为 parameters.yml
每次实施都会发生变化,您只需要在每个环境中进行更改。
可以通过将数据存储在自定义参数文件中来完成。
使用名为 "company_slug" 的全局参数作为 datafixtures 包的键,如下所示:
parameters:
datafixtures:
# Company 1 datafixtures
company1:
defaultusers:
0:
name: john
email: john@company1.lol
1:
name: steve
email: steve@company1.lol
# Company 2 datafixtures
company2:
defaultusers:
0:
name: anna
email: anna@company2.lol
1:
name: eva
email: eva@company2.lol
然后使用此参数开发数据夹具:
public function load(ObjectManager $manager)
{
$companySlug = $this->container->getParameter('company_slug');
if (array_key_exists($companySlug, $this->container->getParameter('datafixtures'))) {
$dataFixtures = $this->container->getParameter('datafixtures')[$companySlug];
} else {
throw $this->createException('No datafixtures parameters found for the company slug '.$companySlug);
}
foreach ($dataFixtures['defaultusers'] as $u) {
$user = new User();
$user->setUserName($u['name']);
$user->setEmail($u['email']);
$manager->persist($user);
$manager->flush();
}
}
目前我们正在为一些在线商店(以及未来可能的新商店)开发一组微服务。出于商业原因,我们将对同一软件进行不同的实施,因此每家商店都会询问自己的一个。
我需要根据实现在数据库上设置不同的初始数据包,这意味着每个数据夹具不同。
我正在寻找一种根据配置参数(company_name、company_slug...)加载正确装置的好方法。最好的方法是什么?
如果您正在使用 doctrine/doctrine-fixtures-bundle
,您可以在文件中使用参数 params.yml
,然后在容器的加载函数中获取它。像这样
//parameters.yml
parameters
config: "Cloud" //it can be anyelse
并在fixtures中加载文件
public function setContainer(ContainerInterface $container = null)
{
var_dump('getting container here');
$this->container = $container;
}
/**
* {@inheritDoc}
*/
public function load(ObjectManager $manager)
{
$config = $this->container->getParameter('config'); //"Cloud"
if($config == "Cloud"){
//Do something
}else{
//Do something else
}
}
我认为这是更好的方法,因为 parameters.yml
每次实施都会发生变化,您只需要在每个环境中进行更改。
可以通过将数据存储在自定义参数文件中来完成。
使用名为 "company_slug" 的全局参数作为 datafixtures 包的键,如下所示:
parameters:
datafixtures:
# Company 1 datafixtures
company1:
defaultusers:
0:
name: john
email: john@company1.lol
1:
name: steve
email: steve@company1.lol
# Company 2 datafixtures
company2:
defaultusers:
0:
name: anna
email: anna@company2.lol
1:
name: eva
email: eva@company2.lol
然后使用此参数开发数据夹具:
public function load(ObjectManager $manager)
{
$companySlug = $this->container->getParameter('company_slug');
if (array_key_exists($companySlug, $this->container->getParameter('datafixtures'))) {
$dataFixtures = $this->container->getParameter('datafixtures')[$companySlug];
} else {
throw $this->createException('No datafixtures parameters found for the company slug '.$companySlug);
}
foreach ($dataFixtures['defaultusers'] as $u) {
$user = new User();
$user->setUserName($u['name']);
$user->setEmail($u['email']);
$manager->persist($user);
$manager->flush();
}
}