Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 0b0c431

Browse filesBrowse 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
Copy full SHA for 0b0c431

File tree

Expand file treeCollapse file tree

2 files changed

+196
-12
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+196
-12
lines changed

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

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php
+34-12Lines 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-
$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->addMethodCall('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
/**
+162Lines 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()
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)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.