2015-01-24 3 views
2

У меня есть куча сущностей, которые не созданы пользователем и не динамичны (они являются частью данных приложения).Репозиторий, получающий данные из файла Yaml

Таким образом, вместо того, чтобы хранить их в БД, я хотел бы сохранить их в файлах Yaml, чтобы они были в порядке.

Удивительно, если есть хорошая практика для их загрузки: пользовательский репозиторий может быть? Я хотел бы, по возможности, сделать так, как с Доктриной: $this->getEntityManager()->getRepository()-findAll() например.

Возможно ли, или мне нужно все-таки перекодировать все? Большое спасибо и у меня хороший день :)

ответ

2

Я использую репозитории на основе 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;   
} 

Обратите внимание, что он реализует поиск и, таким образом, 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'); 

я определяю все мои хранилищ (в том числе Доктрина хранилищ) в качестве услуг и использовать простой получить вместо $ 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' 
0

Я не знаю, правильно ли я понял ваш вопрос, но в Symfony у вас есть компонент YAML для анализа файлов YAML в массив.

http://symfony.com/doc/current/components/yaml/introduction.html

Я думаю, что вы можете работать с этим компонентом.

+0

Благодарим вас за ответ. Я не беспокоюсь о разборе, но о загрузке экземпляров. Я хотел бы сделать это в «стиле DB», например, с помощью Doctrine, потому что у меня будут отношения между объектами, загруженными YAML, и объектами, загруженными DB. – theofabry

Смежные вопросы