|
12 | 12 | namespace Symfony\Bridge\Doctrine\DependencyInjection;
|
13 | 13 |
|
14 | 14 | use Symfony\Component\HttpKernel\DependencyInjection\Extension;
|
| 15 | +use Symfony\Component\DependencyInjection\Alias; |
15 | 16 | use Symfony\Component\DependencyInjection\ContainerBuilder;
|
16 | 17 | use Symfony\Component\DependencyInjection\Definition;
|
17 | 18 | use Symfony\Component\DependencyInjection\Reference;
|
@@ -285,6 +286,68 @@ protected function detectMetadataDriver($dir, ContainerBuilder $container)
|
285 | 286 | return null;
|
286 | 287 | }
|
287 | 288 |
|
| 289 | + /** |
| 290 | + * Loads a configured object manager metadata, query or result cache driver. |
| 291 | + * |
| 292 | + * @param array $objectManager A configured object manager. |
| 293 | + * @param ContainerBuilder $container A ContainerBuilder instance. |
| 294 | + * @param string $cacheName |
| 295 | + * |
| 296 | + * @throws \InvalidArgumentException In case of unknown driver type. |
| 297 | + */ |
| 298 | + protected function loadObjectManagerCacheDriver(array $objectManager, ContainerBuilder $container, $cacheName) |
| 299 | + { |
| 300 | + $cacheDriver = $objectManager[$cacheName.'_driver']; |
| 301 | + $cacheDriverService = $this->getObjectManagerElementName($objectManager['name'] . '_' . $cacheName); |
| 302 | + |
| 303 | + switch ($cacheDriver['type']) { |
| 304 | + case 'service': |
| 305 | + $container->setAlias($cacheDriverService, new Alias($cacheDriver['id'], false)); |
| 306 | + |
| 307 | + return; |
| 308 | + case 'memcache': |
| 309 | + $memcacheClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.memcache.class').'%'; |
| 310 | + $memcacheInstanceClass = !empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%'.$this->getObjectManagerElementName('cache.memcache_instance.class').'%'; |
| 311 | + $memcacheHost = !empty($cacheDriver['host']) ? $cacheDriver['host'] : '%'.$this->getObjectManagerElementName('cache.memcache_host').'%'; |
| 312 | + $memcachePort = !empty($cacheDriver['port']) ? $cacheDriver['port'] : '%'.$this->getObjectManagerElementName('cache.memcache_port').'%'; |
| 313 | + $cacheDef = new Definition($memcacheClass); |
| 314 | + $memcacheInstance = new Definition($memcacheInstanceClass); |
| 315 | + $memcacheInstance->addMethodCall('connect', array( |
| 316 | + $memcacheHost, $memcachePort |
| 317 | + )); |
| 318 | + $container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcache_instance', $objectManager['name'])), $memcacheInstance); |
| 319 | + $cacheDef->addMethodCall('setMemcache', array(new Reference($this->getObjectManagerElementName(sprintf('%s_memcache_instance', $objectManager['name']))))); |
| 320 | + break; |
| 321 | + case 'memcached': |
| 322 | + $memcachedClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.memcached.class').'%'; |
| 323 | + $memcachedInstanceClass = !empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%'.$this->getObjectManagerElementName('cache.memcached_instance.class').'%'; |
| 324 | + $memcachedHost = !empty($cacheDriver['host']) ? $cacheDriver['host'] : '%'.$this->getObjectManagerElementName('cache.memcached_host').'%'; |
| 325 | + $memcachedPort = !empty($cacheDriver['port']) ? $cacheDriver['port'] : '%'.$this->getObjectManagerElementName('cache.memcached_port').'%'; |
| 326 | + $cacheDef = new Definition($memcachedClass); |
| 327 | + $memcachedInstance = new Definition($memcachedInstanceClass); |
| 328 | + $memcachedInstance->addMethodCall('addServer', array( |
| 329 | + $memcachedHost, $memcachedPort |
| 330 | + )); |
| 331 | + $container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcached_instance', $objectManager['name'])), $memcachedInstance); |
| 332 | + $cacheDef->addMethodCall('setMemcached', array(new Reference($this->getObjectManagerElementName(sprintf('%s_memcached_instance', $objectManager['name']))))); |
| 333 | + break; |
| 334 | + case 'apc': |
| 335 | + case 'array': |
| 336 | + case 'xcache': |
| 337 | + $cacheDef = new Definition('%'.$this->getObjectManagerElementName(sprintf('cache.%s.class', $cacheDriver['type'])).'%'); |
| 338 | + break; |
| 339 | + default: |
| 340 | + throw new \InvalidArgumentException(sprintf('"%s" is an unrecognized Doctrine cache driver.', $cacheDriver['type'])); |
| 341 | + } |
| 342 | + |
| 343 | + $cacheDef->setPublic(false); |
| 344 | + // generate a unique namespace for the given application |
| 345 | + $namespace = 'sf2'.$this->getMappingResourceExtension().'_'.$objectManager['name'].'_'.md5($container->getParameter('kernel.root_dir').$container->getParameter('kernel.environment')); |
| 346 | + $cacheDef->addMethodCall('setNamespace', array($namespace)); |
| 347 | + |
| 348 | + $container->setDefinition($cacheDriverService, $cacheDef); |
| 349 | + } |
| 350 | + |
288 | 351 | /**
|
289 | 352 | * Prefixes the relative dependency injection container path with the object manager prefix.
|
290 | 353 | *
|
|
0 commit comments