Movatterモバイル変換


[0]ホーム

URL:


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

Sign up
Appearance settings

Commit0b0c431

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 parentsf0d9af0 +7528e4c commit0b0c431

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
protectedfunctionloadObjectManagerCacheDriver(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+
protectedfunctionloadCacheDriver($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,newAlias($cacheDriver['id'],false));
330+
$container->setAlias($cacheDriverServiceId,newAlias($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(newReference($this->getObjectManagerElementName(sprintf('%s_memcache_instance',$objectManager['name'])))));
343+
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcache_instance',$objectManagerName)),$memcacheInstance);
344+
$cacheDef->addMethodCall('setMemcache',array(newReference($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(newReference($this->getObjectManagerElementName(sprintf('%s_memcached_instance',$objectManager['name'])))));
356+
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcached_instance',$objectManagerName)),$memcachedInstance);
357+
$cacheDef->addMethodCall('setMemcached',array(newReference($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(newReference($this->getObjectManagerElementName(sprintf('%s_redis_instance',$objectManager['name'])))));
369+
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_redis_instance',$objectManagerName)),$redisInstance);
370+
$cacheDef->addMethodCall('setRedis',array(newReference($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
/**
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+
namespaceSymfony\Bridge\Doctrine\Tests\DependencyInjection\Compiler;
13+
14+
useSymfony\Component\DependencyInjection\Definition;
15+
useSymfony\Component\DependencyInjection\ContainerBuilder;
16+
useSymfony\Component\DependencyInjection\ParameterBag\ParameterBag;
17+
18+
/**
19+
* @author Fabio B. Silva <fabio.bat.silva@gmail.com>
20+
*/
21+
class DoctrineExtensionTestextends \PHPUnit_Framework_TestCase
22+
{
23+
/**
24+
* @var \Symfony\Bridge\Doctrine\DependencyInjection\AbstractDoctrineExtension
25+
*/
26+
private$extension;
27+
28+
protectedfunctionsetUp()
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+
publicfunctionproviderBasicDrivers()
52+
{
53+
returnarray(
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+
publicfunctiontestLoadBasicCacheDriver($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+
publicfunctiontestServiceCacheDriver()
100+
{
101+
$cacheName ='metadata_cache';
102+
$container =$this->createContainer();
103+
$definition =newDefinition('%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+
publicfunctiontestUnrecognizedCacheDriverException()
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+
protectedfunctioninvokeLoadCacheDriver(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+
protectedfunctioncreateContainer(array$data =array())
152+
{
153+
returnnewContainerBuilder(newParameterBag(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)

[8]ページ先頭

©2009-2025 Movatter.jp