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