Skip to content

Commit

Permalink
Merge pull request kayue#16 from luiges90/cache-driver
Browse files Browse the repository at this point in the history
Cache driver: Get cache driver implementation from doctrine.orm config
  • Loading branch information
kayue committed Jun 26, 2013
2 parents 6f81149 + 432f556 commit 51e1c3a
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 96 deletions.
37 changes: 1 addition & 36 deletions DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,45 +28,10 @@ public function getConfigTreeBuilder()
->scalarNode('cookie_path')->defaultValue('/')->end()
->scalarNode('cookie_domain')->defaultValue(null)->end()
->scalarNode('table_prefix')->defaultValue('wp_')->end()
->arrayNode('orm')
->append($this->getCacheDriverNode('query_cache_driver'))
->append($this->getCacheDriverNode('metadata_cache_driver'))
->append($this->getCacheDriverNode('result_cache_driver'))
->end()
->scalarNode('base_entity_manager')->defaultValue('default')->end()
->end();

return $treeBuilder;
}


/**
* Return a ORM cache driver node for an given entity manager
*
* @param string $name
*
* @return ArrayNodeDefinition
*/
private function getCacheDriverNode($name)
{
$treeBuilder = new TreeBuilder();
$node = $treeBuilder->root($name);

$node
->addDefaultsIfNotSet()
->beforeNormalization()
->ifString()
->then(function($v) { return array('type' => $v); })
->end()
->children()
->scalarNode('type')->defaultValue('array')->end()
->scalarNode('host')->end()
->scalarNode('port')->end()
->scalarNode('instance_class')->end()
->scalarNode('class')->end()
->scalarNode('id')->end()
->end()
;

return $node;
}
}
116 changes: 56 additions & 60 deletions Model/BlogManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use Kayue\WordpressBundle\Event\SwitchBlogEvent;
use Kayue\WordpressBundle\WordpressEvents;
use Symfony\Component\DependencyInjection\Container;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\EventDispatcher\EventDispatcher;

class BlogManager implements BlogManagerInterface
Expand Down Expand Up @@ -42,16 +43,17 @@ public function __construct(Container $container)
*/
public function findBlogById($id)
{
$baseEmName = $this->container->getParameter('kayue_wordpress.base_entity_manager');
$baseConfig = $this->container->get('doctrine.orm.'.$baseEmName.'_entity_manager')->getConfiguration();

if (!isset($this->blogs[$id])) {
$em = WordpressEntityManager::create(
$this->container->get('database_connection'),
$this->container->get('doctrine.orm.entity_manager')->getConfiguration()
$this->container->get('database_connection'), $baseConfig
);

// TODO: Set query cache and result cache here
// $em->getMetadataFactory()->setCacheDriver($this->getCacheImpl('metadata_cache'));
// $em->getConfiguration()->setQueryCacheImpl($this->getCacheImpl('query_cache'));
// $em->getConfiguration()->setResultCacheImpl($this->getCacheImpl('result_cache'));
$em->getMetadataFactory()->setCacheDriver($this->getCacheImpl('metadata_cache'));
$em->getConfiguration()->setQueryCacheImpl($this->getCacheImpl('query_cache'));
$em->getConfiguration()->setResultCacheImpl($this->getCacheImpl('result_cache'));

try {
if (null === $em->getRepository('KayueWordpressBundle:Blog')->findOneBy(array('id'=>$id))) {
Expand Down Expand Up @@ -94,6 +96,7 @@ public function setCurrentBlogId($currentBlogId)
$dispatcher->dispatch(WordpressEvents::SWITCH_BLOG, $event);
}

private static $autoId = 0;
/**
* Loads a configured object manager metadata, query or result cache driver.
*
Expand All @@ -105,66 +108,59 @@ public function setCurrentBlogId($currentBlogId)
*/
protected function getCacheImpl($cacheName)
{
$orm = $this->container->getParameter('kayue_wordpress.orm');



switch ($orm[$name]['type']) {
case 'memcache':
$memcacheClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.memcache.class').'%';
$memcacheInstanceClass = !empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%'.$this->getObjectManagerElementName('cache.memcache_instance.class').'%';
$memcacheHost = !empty($cacheDriver['host']) ? $cacheDriver['host'] : '%'.$this->getObjectManagerElementName('cache.memcache_host').'%';
$memcachePort = !empty($cacheDriver['port']) || (isset($cacheDriver['port']) && $cacheDriver['port'] === 0) ? $cacheDriver['port'] : '%'.$this->getObjectManagerElementName('cache.memcache_port').'%';
$cacheDef = new Definition($memcacheClass);
$memcacheInstance = new Definition($memcacheInstanceClass);
$memcacheInstance->addMethodCall('connect', array(
$memcacheHost, $memcachePort
));
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcache_instance', $objectManager['name'])), $memcacheInstance);
$cacheDef->addMethodCall('setMemcache', array(new Reference($this->getObjectManagerElementName(sprintf('%s_memcache_instance', $objectManager['name'])))));
break;
case 'memcached':
$memcachedClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.memcached.class').'%';
$memcachedInstanceClass = !empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%'.$this->getObjectManagerElementName('cache.memcached_instance.class').'%';
$memcachedHost = !empty($cacheDriver['host']) ? $cacheDriver['host'] : '%'.$this->getObjectManagerElementName('cache.memcached_host').'%';
$memcachedPort = !empty($cacheDriver['port']) ? $cacheDriver['port'] : '%'.$this->getObjectManagerElementName('cache.memcached_port').'%';
$cacheDef = new Definition($memcachedClass);
$memcachedInstance = new Definition($memcachedInstanceClass);
$memcachedInstance->addMethodCall('addServer', array(
$memcachedHost, $memcachedPort
));
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_memcached_instance', $objectManager['name'])), $memcachedInstance);
$cacheDef->addMethodCall('setMemcached', array(new Reference($this->getObjectManagerElementName(sprintf('%s_memcached_instance', $objectManager['name'])))));
$baseEmName = $this->container->getParameter('kayue_wordpress.base_entity_manager');
$config = $this->container->get('doctrine.orm.'.$baseEmName.'_entity_manager')->getConfiguration();

switch ($cacheName) {
case 'metadata_cache':
$baseCache = $config->getMetadataCacheImpl();
break;
case 'redis':
$redisClass = !empty($cacheDriver['class']) ? $cacheDriver['class'] : '%'.$this->getObjectManagerElementName('cache.redis.class').'%';
$redisInstanceClass = !empty($cacheDriver['instance_class']) ? $cacheDriver['instance_class'] : '%'.$this->getObjectManagerElementName('cache.redis_instance.class').'%';
$redisHost = !empty($cacheDriver['host']) ? $cacheDriver['host'] : '%'.$this->getObjectManagerElementName('cache.redis_host').'%';
$redisPort = !empty($cacheDriver['port']) ? $cacheDriver['port'] : '%'.$this->getObjectManagerElementName('cache.redis_port').'%';
$cacheDef = new Definition($redisClass);
$redisInstance = new Definition($redisInstanceClass);
$redisInstance->addMethodCall('connect', array(
$redisHost, $redisPort
));
$container->setDefinition($this->getObjectManagerElementName(sprintf('%s_redis_instance', $objectManager['name'])), $redisInstance);
$cacheDef->addMethodCall('setRedis', array(new Reference($this->getObjectManagerElementName(sprintf('%s_redis_instance', $objectManager['name'])))));
case 'query_cache':
$baseCache = $config->getQueryCacheImpl();
break;
case 'apc':
case 'array':
case 'xcache':
case 'wincache':
case 'zenddata':
$cacheDef = new Definition('%'.$this->getObjectManagerElementName(sprintf('cache.%s.class', $cacheDriver['type'])).'%');
case 'result_cache':
$baseCache = $config->getResultCacheImpl();
break;
default:
throw new \InvalidArgumentException(sprintf('"%s" is an unrecognized Doctrine cache driver.', $cacheDriver['type']));
throw new \InvalidArgumentException(sprintf('"%s" is an unrecognized Doctrine cache name.
Supported cache names are: "metadata_cache", "query_cache" and "result_cache"', $cacheName));
}

$cacheDef->setPublic(false);
// generate a unique namespace for the given application
$namespace = 'sf2'.$this->getMappingResourceExtension().'_'.$objectManager['name'].'_'.md5($container->getParameter('kernel.root_dir').$container->getParameter('kernel.environment'));
$cacheDef->addMethodCall('setNamespace', array($namespace));
$namespace = 'sf2'.md5($this->container->getParameter('kernel.root_dir').$this->container->getParameter('kernel.environment')
.$cacheName.self::$autoId);
self::$autoId++;

$className = get_class($baseCache);

switch ($className) {
case 'Doctrine\Common\Cache\ApcCache':
case 'Doctrine\Common\Cache\ArrayCache':
case 'Doctrine\Common\Cache\XcacheCache':
case 'Doctrine\Common\Cache\WinCacheCache':
case 'Doctrine\Common\Cache\ZendDataCache':
$cache = new $className();
break;
case 'Doctrine\Common\Cache\MemcacheCache':
$memcache = $baseCache->getMemcache();
$cache = new $className();
$cache->setMemcache($memcache);
break;
case 'Doctrine\Common\Cache\MemcachedCache':
$memcached = $baseCache->getMemcached();
$cache = new $className();
$cache->setMemcached($memcached);
break;
case 'Doctrine\Common\Cache\RedisCache':
$redis = $baseCache->getRedis();
$cache = new $className();
$cache->setRedis($redis);
break;
default:
throw new \InvalidArgumentException(sprintf('Unknown or unsupported cache type class in configuration: "%s"', get_class($baseCache)));
}
$cache->setNamespace($namespace);

$container->setDefinition($cacheDriverService, $cacheDef);
return $cache;
}

}

0 comments on commit 51e1c3a

Please sign in to comment.