diff --git a/app/config/services.yml b/app/config/services.yml index 5ac497a..0f2ddfb 100644 --- a/app/config/services.yml +++ b/app/config/services.yml @@ -24,6 +24,9 @@ services: public: true tags: ['controller.service_arguments'] + app.relations.cache_provider: + class: Doctrine\Common\Cache\ArrayCache + app.brickset.cache_provider: class: Doctrine\Common\Cache\PhpFileCache arguments: ["%kernel.cache_dir%/brickset", ".cache.php"] @@ -76,6 +79,8 @@ services: $rebrickableDownloadUrl: '%app.rebrickable_downloads_url%' AppBundle\Util\RelationMapper: + arguments: + - '@app.relations.cache_provider' calls: - [ loadResource, ['%kernel.root_dir%/Resources/relations/part_model.yml', 'part_model']] - [ loadResource, ['%kernel.root_dir%/Resources/relations/alias_model.yml', 'alias_model']] diff --git a/src/AppBundle/Util/RelationMapper.php b/src/AppBundle/Util/RelationMapper.php index 7fadf63..0ff2ab8 100644 --- a/src/AppBundle/Util/RelationMapper.php +++ b/src/AppBundle/Util/RelationMapper.php @@ -4,6 +4,7 @@ namespace AppBundle\Util; use AppBundle\Exception\RelationMapper\InvalidResourceException; use AppBundle\Exception\RelationMapper\ResourceNotFoundException; +use Doctrine\Common\Cache\CacheProvider; use Symfony\Component\OptionsResolver\Exception\InvalidArgumentException; use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException; use Symfony\Component\Yaml\Exception\ParseException; @@ -16,6 +17,16 @@ class RelationMapper */ private $relations; + /** + * RelationMapper constructor. + * @param CacheProvider $cache + */ + public function __construct(CacheProvider $cache) + { + $this->cache = $cache; + } + + /** * Adds a Resource. * @@ -31,8 +42,13 @@ class RelationMapper } try { + if (!$data = unserialize($this->cache->fetch($domain))) { + $data = Yaml::parse(file_get_contents($file),yaml::PARSE_KEYS_AS_STRINGS); + $this->cache->save($domain, serialize($data), 60); + } + $this->relations[$domain] = []; - $this->relations[$domain] = Yaml::parse(file_get_contents($file)); + $this->relations[$domain] = $data; } catch (ParseException $e) { throw new InvalidResourceException(sprintf('Error parsing YAML, invalid file "%s"', $file), 0, $e); } diff --git a/tests/AppBundle/Controller/DefaultControllerTest.php b/tests/AppBundle/Controller/DefaultControllerTest.php new file mode 100644 index 0000000..cf961a4 --- /dev/null +++ b/tests/AppBundle/Controller/DefaultControllerTest.php @@ -0,0 +1,15 @@ +loadResource(__DIR__.'/fixtures/resources.yml', 'resources'); $this->assertEquals('bar', $mapper->find('foo','resources')); @@ -23,7 +24,7 @@ class RelationMapperTest extends TestCase */ public function testLoadNonExistingResource() { - $mapper = new RelationMapper(); + $mapper = new RelationMapper(new ArrayCache()); $resource = __DIR__.'/fixtures/non-existing.yml'; $mapper->loadResource($resource, 'resources'); } @@ -33,7 +34,7 @@ class RelationMapperTest extends TestCase */ public function testLoadInvalidResource() { - $mapper = new RelationMapper(); + $mapper = new RelationMapper(new ArrayCache()); $resource = __DIR__.'/fixtures/invalid.yml'; $mapper->loadResource($resource, 'resources'); }