存储库从Yaml文件获取数据

时间:2015-01-24 19:20:32

标签: symfony yaml

我有一堆实体,它们不是用户创建的,也不是动态的(它们是应用程序数据的一部分)。

因此,我不想将它们存储在数据库中,而是将它们保存在Yaml文件中以保持版本化。

我想知道加载它们是否有好的做法:自定义存储库可能吗?如果可能的话,我希望像Doctrine一样:$this->getEntityManager()->getRepository()-findAll()

是否可以或者我需要自己重新编码所有内容?非常感谢,祝你有个美好的一天:)

2 个答案:

答案 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

我认为您可以使用该组件。