存储库从 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'