我有一堆实体,它们不是用户创建的,也不是动态的(它们是应用程序数据的一部分)。
因此,我不想将它们存储在数据库中,而是将它们保存在Yaml文件中以保持版本化。
我想知道加载它们是否有好的做法:自定义存储库可能吗?如果可能的话,我希望像Doctrine一样:$this->getEntityManager()->getRepository()-findAll()
。
是否可以或者我需要自己重新编码所有内容?非常感谢,祝你有个美好的一天:)
答案 0 :(得分:3)
我经常使用基于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存储库和doctrine存储库之间切换,而无需更改我的应用程序代码。为了完整起见,以下是将doctrine存储库定义为服务的方法:
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'
答案 1 :(得分:0)
我不知道我是否正确理解了您的问题,但在Symfony中,您有一个YAML组件可以将YAML文件解析为数组。
http://symfony.com/doc/current/components/yaml/introduction.html
我认为您可以使用该组件。