8000 feature #9833 [Bridge] [DoctrineExtension] Allow cache drivers that a… · symfony/symfony@0b0c431 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0b0c431

Browse files
committed
feature #9833 [Bridge] [DoctrineExtension] Allow cache drivers that are not an EM's child (FabioBatSilva)
This PR was merged into the 2.5-dev branch. Discussion ---------- [Bridge] [DoctrineExtension] Allow cache drivers that are not an EM's child | Q | A | ------------- | --- | Bug fix? | [no] | New feature? | [yes] | BC breaks? | [no] | Deprecations? | [no] | Tests pass? | [yes|] | Fixed tickets | [] | License | MIT | Doc PR | [doctrine/orm#808, doctrine/DoctrineBundle#224] Commits ------- 7528e4c Allow cache drivers that are not an EM's child
2 parents f0d9af0 + 7528e4c commit 0b0c431

File tree

2 files changed

+196
-12
lines changed

2 files changed

+196
-12
lines changed

src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -306,14 +306,30 @@ protected function detectMetadataDriver($dir, ContainerBuilder $container)
306306
*/
307307
protected function loadObjectManagerCacheDriver(array $objectManager, ContainerBuilder $container, $cacheName)
308308
{
309-
$cacheDriver = $objectManager[$cacheName.'_driver'];
310-
$cacheDriverService = $this->getObjectManagerElementName($objectManager['name'].'_'.$cacheName);
309+
$this->loadCacheDriver($cacheName, $objectManager['name'], $objectManager[$cacheName.'_driver'], $container);
310+
}
311+
312+
/**
313+
* Loads a cache driver.
314+
*
315+
* @param string $cacheDriverServiceId The cache driver name.
316+
* @param string $objectManagerName The object manager name.
317+
* @param array $cacheDriver The cache driver mapping.
318+
* @param \Symfony\Component\DependencyInjection\ContainerBuilder $container The ContainerBuilder instance.
319+
*
320+
* @return string
321+
*
322+
* @throws \InvalidArgumentException
323+
*/
324+
protected function loadCacheDriver($cacheName, $objectManagerName, array $cacheDriver, ContainerBuilder $container)
325+
{
326+
$cacheDriverServiceId = $this->getObjectManagerElementName($objectManagerName . '_' . $cacheName);
311327

312328
switch ($cacheDriver['type']) {
313329
case 'service':
314 8000 -
$container->setAlias($cacheDriverService, new Alias($cacheDriver['id'], false));
330+
$container->setAlias($cacheDriverServiceId, new Alias($cacheDriver['id'], false));
315331

316-
return;
332+
return $cacheDriverServiceId;
317333
case 'memcache':
318334
$memcacheClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.memcache.class').'%';
319335
$memcacheInstanceClass = !empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%'.$this->getObjectManagerElementName('cache.memcache_instance.class').'%';
@@ -324,8 +340,8 @@ protected function loadObjectManagerCacheDriver(array $objectManager, ContainerB
324340
$memcacheInstance->addMethodCall('connect', array(
325341
$memcacheHost, $memcachePort
326342
));
327-
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcache_instance', $objectManager['name'])), $memcacheInstance);
328-
$cacheDef->addMethodCall('setMemcache', array(new Reference($this->getObjectManagerElementName(sprintf('%s_memcache_instance', $objectManager['name'])))));
343+
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcache_instance', $objectManagerName)), $memcacheInstance);
344+
$cacheDef->addMethodCall('setMemcache', array(new Reference($this->getObjectManagerElementName(sprintf('%s_memcache_instance', $objectManagerName)))));
329345
break;
330346
case 'memcached':
331347
$memcachedClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.memcached.class').'%';
@@ -337,8 +353,8 @@ protected function loadObjectManagerCacheDriver(array $objectManager, ContainerB
337353
$memcachedInstance->addMethodCall('addServer', array(
338354
$memcachedHost, $memcachedPort
339355
));
340-
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcached_instance', $objectManager['name'])), $memcachedInstance);
341-
$cacheDef->addMethodCall('setMemcached', array(new Reference($this->getObjectManagerElementName(sprintf('%s_memcached_instance', $objectManager['name'])))));
356+
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcached_instance', $objectManagerName)), $memcachedInstance);
357+
$cacheDef->addMethodCall('setMemcached', array(new Reference($this->getObjectManagerElementName(sprintf('%s_memcached_instance', $objectManagerName)))));
342358
break;
343359
case 'redis':
344360
$redisClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.redis.class').'%';
@@ -350,8 +366,8 @@ protected function loadObjectManagerCacheDriver(array $objectManager, ContainerB
350366
$redisInstance->addMethodCall('connect', array(
351367
$redisHost, $redisPort
352368
));
353-
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_redis_instance', $objectManager['name'])), $redisInstance);
354-
$cacheDef->addM A3E2 ethodCall('setRedis', array(new Reference($this->getObjectManagerElementName(sprintf('%s_redis_instance', $objectManager['name'])))));
369+
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_redis_instance', $objectManagerName)), $redisInstance);
370+
$cacheDef->addMethodCall('setRedis', array(new Reference($this->getObjectManagerElementName(sprintf('%s_redis_instance', $objectManagerName)))));
355371
break;
356372
case 'apc':
357373
case 'array':
@@ -368,12 +384,18 @@ protected function loadObjectManagerCacheDriver(array $objectManager, ContainerB
368384

369385
if (!isset($cacheDriver['namespace'])) {
370386
// generate a unique namespace for the given application
371-
$cacheDriver['namespace'] = 'sf2'.$this->getMappingResourceExtension().'_'.$objectManager['name'].'_'.hash('sha256',($container->getParameter('kernel.root_dir').$container->getParameter('kernel.environment')));
387+
$env = $container->getParameter('kernel.root_dir').$container->getParameter('kernel.environment');
388+
$hash = hash('sha256', $env);
389+
$namespace = 'sf2'.$this->getMappingResourceExtension().'_'.$objectManagerName.'_'.$hash;
390+
391+
$cacheDriver['namespace'] = $namespace;
372392
}
373393

374394
$cacheDef->addMethodCall('setNamespace', array($cacheDriver['namespace']));
375395

376-
$container->setDefinition($cacheDriverService, $cacheDef);
396+
$container->setDefinition($cacheDriverServiceId, $cacheDef);
397+
398+
return $cacheDriverServiceId;
377399
}
378400

379401
/**
< F438 div class="pt-3">
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Bridge\Doctrine\Tests\DependencyInjection\Compiler;
13+
14+
use Symfony\Component\DependencyInjection\Definition;
15+
use Symfony\Component\DependencyInjection\ContainerBuilder;
16+
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
17+
18+
/**
19+
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
20+
*/
21+
class DoctrineExtensionTest extends \PHPUnit_Framework_TestCase
22+
{
23+
/**
24+
* @var \Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension
25+
*/
26+
private $extension;
27+
28+
protected function setUp()
29+
{
30+
parent::setUp();
31+
32+
$this->extension = $this
33+
->getMockBuilder('Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension')
34+
->setMethods(array(
35+
'getMappingResourceConfigDirectory',
36+
'getObjectManagerElementName',
37+
'getMappingObjectDefaultName',
38+
'getMappingResourceExtension',
39+
'load',
40+
))
41+
->getMock()
42+
;
43+
44+
$this->extension->expects($this->any())
45+
->method('getObjectManagerElementName')
46+
->will($this->returnCallback(function ($name) {
47+
return 'doctrine.orm.'.$name;
48+
}));
49+
}
50+
51+
public function providerBasicDrivers()
52+
{
53+
return array(
54+
array('doctrine.orm.cache.apc.class', array('type' => 'apc')),
55+
array('doctrine.orm.cache.array.class', array('type' => 'array')),
56+
array('doctrine.orm.cache.xcache.class', array('type' => 'xcache')),
57+
array('doctrine.orm.cache.wincache.class', array('type' => 'wincache')),
58+
array('doctrine.orm.cache.zenddata.class', array('type' => 'zenddata')),
59+
array('doctrine.orm.cache.redis.class', array('type' => 'redis'), array('setRedis')),
60+
array('doctrine.orm.cache.memcache.class', array('type' => 'memcache'), array('setMemcache')),
61+
array('doctrine.orm.cache.memcached.class', array('type' => 'memcached'), array('setMemcached')),
62+
);
63+
}
64+
65+
/**
66+
* @param string $class
67+
* @param array $config
68+
*
69+
* @dataProvider providerBasicDrivers
70+
*/
71+
public function testLoadBasicCacheDriver($class, array $config, array $expectedCalls = array())
72+
{
73+
$container = $this->createContainer();
74+
$cacheName = 'metadata_cache';
75+
$objectManager = array(
76+
'name' => 'default',
77+
'metadata_cache_driver' => $config
78+
);
79+
80+
$this->invokeLoadCacheDriver($objectManager, $container, $cacheName);
81+
82+
$this->assertTrue($container->hasDefinition('doctrine.orm.default_metadata_cache'));
83+
84+
$definition = $container->getDefinition('doctrine.orm.default_metadata_cache');
85+
$defCalls = $definition->getMethodCalls();
86+
$expectedCalls[] = 'setNamespace';
87+
$actualCalls = array_map(function ($call) {
88+
return $call[0];
89+
}, $defCalls);
90+
91+
$this->assertFalse($definition->isPublic());
92+
$this->assertEquals("%$class%", $definition->getClass());
93+
94+
foreach (array_unique($expectedCalls) as $call) {
95+
$this->assertContains($call, $actualCalls);
96+
}
97+
}
98+
99+
public function testServiceCacheDriver()
100+
{
101+
$cacheName = 'metadata_cache';
102+
$container = $this->createContainer();
103+
$definition = new Definition('%doctrine.orm.cache.apc.class%');
104+
$objectManager = array(
105+
'name' => 'default',
106+
'metadata_cache_driver' => array(
107+
'type' => 'service',
108+
'id' => 'service_driver'
109+
)
110+
);
111+
112+
$container->setDefinition('service_driver', $definition);
113+
114+
$this->invokeLoadCacheDriver($objectManager, $container, $cacheName);
115+
116+
$this->assertTrue($container->hasAlias('doctrine.orm.default_metadata_cache'));
117+
}
118+
119+
/**
120+
* @expectedException InvalidArgumentException
121+
* @expectedExceptionMessage "unrecognized_type" is an unrecognized Doctrine cache driver.
122+
*/
123+
public function testUnrecognizedCacheDriverException()
< 179B /td>
124+
{
125+
$cacheName = 'metadata_cache';
126+
$container = $this->createContainer();
127+
$objectManager = array(
128+
'name' => 'default',
129+
'metadata_cache_driver' => array(
130+
'type' => 'unrecognized_type'
131+
)
132+
);
133+
134+
$this->invokeLoadCacheDriver($objectManager, $container, $cacheName);
135+
}
136+
137+
protected function invokeLoadCacheDriver(array $objectManager, ContainerBuilder $container, $cacheName)
138+
{
139+
$method = new \ReflectionMethod($this->extension, 'loadObjectManagerCacheDriver');
140+
141+
$method->setAccessible(true);
142+
143+
$method->invokeArgs($this->extension, array($objectManager, $container, $cacheName));
144+
}
145+
146+
/**
147+
* @param array $data
148+
*
149+
* @return \Symfony\Component\DependencyInjection\ContainerBuilder
150+
*/
151+
protected function createContainer(array $data = array())
152+
{
153+
return new ContainerBuilder(new ParameterBag(array_merge(array(
154+
'kernel.bundles' => array('FrameworkBundle' => 'Symfony\\Bundle\\FrameworkBundle\\FrameworkBundle'),
155+
'kernel.cache_dir' => __DIR__,
156+
'kernel.debug' => false,
157+
'kernel.environment' => 'test',
158+
'kernel.name' => 'kernel',
159+
'kernel.root_dir' => __DIR__,
160+
), $data)));
161+
}
162+
}

0 commit comments

Comments
 (0)
0