存储库从 Yaml 文件中获取数据
Repository getting data from Yaml file
我有一堆既不是用户创建的也不是动态的实体(它们是应用程序数据的一部分)。
所以我不想将它们存储在数据库中,而是将它们保存在 Yaml 文件中以保持版本化。
我想知道是否有加载它们的好习惯:也许是自定义存储库?如果可能的话,我想像 Doctrine 那样做:例如 $this->getEntityManager()->getRepository()-findAll()
。
是否可以或我需要自己重新编码所有内容?非常感谢,祝你有美好的一天:)
我不知道我是否正确理解了你的问题,但在 Symfony 中你有一个 YAML 组件来将 YAML 文件解析为一个数组。
http://symfony.com/doc/current/components/yaml/introduction.html
我认为您可以使用该组件。
我经常使用基于 YAML 的存储库。这是一个例子:
namespace Cerad\Bundle\LevelBundle\InMemory;
class LevelRepository implements LevelRepositoryInterface
{
protected $levels = array();
public function __construct($files)
{
foreach($files as $file)
{
$configs = Yaml::parse(file_get_contents($file));
foreach($configs as $id => $config)
{
$config['id'] = $id;
$level = new Level($config);
$this->levels[$id] = $level;
}
}
}
public function find($id)
{
return isset($this->levels[$id]) ? $this->levels[$id] : null;
}
public function findAll()
{
return $this->levels;
}
注意它实现了 find 和 findAll 从而模拟了一个 Doctrine 存储库。事实上,它被设计成可以与 Doctrine 存储库互换,以防我决定使用 Doctrine。此示例仅显示两个存储库方法,但可以根据需要添加其他方法。
我将其定义为服务:
# services.yml
services:
cerad_level__level_repository__in_memory:
class: Cerad\Bundle\LevelBundle\InMemory\LevelRepository
arguments:
- '%cerad_level_level_files%'
cerad_level__level_repository:
alias: cerad_level__level_repository__in_memory
cerad_level_level_files 参数在配置文件中定义,因此我可以调整从哪些文件加载关卡。
从控制器访问服务:
$levelRepository = $this->get('cerad_level__level_repository');
我将所有存储库(包括 Doctrine 存储库)定义为服务,并使用简单的 get 代替 $this->getEntityManager()->getRepository()...
别名让我可以在 yaml 存储库和学说存储库之间切换,而无需更改我的应用程序代码。为完整起见,以下是如何将学说存储库定义为服务:
cerad_game__game_repository__doctrine:
class: Cerad\Bundle\GameBundle\Doctrine\EntityRepository\GameRepository
factory_service: 'doctrine.orm.games_entity_manager'
factory_method: 'getRepository'
arguments:
- 'Cerad\Bundle\GameBundle\Doctrine\Entity\Game'
我有一堆既不是用户创建的也不是动态的实体(它们是应用程序数据的一部分)。
所以我不想将它们存储在数据库中,而是将它们保存在 Yaml 文件中以保持版本化。
我想知道是否有加载它们的好习惯:也许是自定义存储库?如果可能的话,我想像 Doctrine 那样做:例如 $this->getEntityManager()->getRepository()-findAll()
。
是否可以或我需要自己重新编码所有内容?非常感谢,祝你有美好的一天:)
我不知道我是否正确理解了你的问题,但在 Symfony 中你有一个 YAML 组件来将 YAML 文件解析为一个数组。
http://symfony.com/doc/current/components/yaml/introduction.html
我认为您可以使用该组件。
我经常使用基于 YAML 的存储库。这是一个例子:
namespace Cerad\Bundle\LevelBundle\InMemory;
class LevelRepository implements LevelRepositoryInterface
{
protected $levels = array();
public function __construct($files)
{
foreach($files as $file)
{
$configs = Yaml::parse(file_get_contents($file));
foreach($configs as $id => $config)
{
$config['id'] = $id;
$level = new Level($config);
$this->levels[$id] = $level;
}
}
}
public function find($id)
{
return isset($this->levels[$id]) ? $this->levels[$id] : null;
}
public function findAll()
{
return $this->levels;
}
注意它实现了 find 和 findAll 从而模拟了一个 Doctrine 存储库。事实上,它被设计成可以与 Doctrine 存储库互换,以防我决定使用 Doctrine。此示例仅显示两个存储库方法,但可以根据需要添加其他方法。
我将其定义为服务:
# services.yml
services:
cerad_level__level_repository__in_memory:
class: Cerad\Bundle\LevelBundle\InMemory\LevelRepository
arguments:
- '%cerad_level_level_files%'
cerad_level__level_repository:
alias: cerad_level__level_repository__in_memory
cerad_level_level_files 参数在配置文件中定义,因此我可以调整从哪些文件加载关卡。
从控制器访问服务:
$levelRepository = $this->get('cerad_level__level_repository');
我将所有存储库(包括 Doctrine 存储库)定义为服务,并使用简单的 get 代替 $this->getEntityManager()->getRepository()...
别名让我可以在 yaml 存储库和学说存储库之间切换,而无需更改我的应用程序代码。为完整起见,以下是如何将学说存储库定义为服务:
cerad_game__game_repository__doctrine:
class: Cerad\Bundle\GameBundle\Doctrine\EntityRepository\GameRepository
factory_service: 'doctrine.orm.games_entity_manager'
factory_method: 'getRepository'
arguments:
- 'Cerad\Bundle\GameBundle\Doctrine\Entity\Game'