PHPCR nodes and meta cache override

378 Views Asked by At

I am using Symfony CMF, PHPCR and SncRedisBundle. I want to add metadata and nodes caching for PHPCR to SncRedisBundle.

For testing purposes, I have modified the loadDoctrine function in the file Snc\RedisBundle\DependencyInjection\SncRedisExtension.php (see the comment "PHPCR metadata definition override" for the code that I have added, 1 line).

protected function loadDoctrine(array $config, ContainerBuilder $container)
{
    foreach ($config['doctrine'] as $name => $cache) {
        $client = new Reference(sprintf('snc_redis.%s_client', $cache['client']));
        foreach ($cache['entity_managers'] as $em) {
            $def = new Definition($container->getParameter('snc_redis.doctrine_cache.class'));
            $def->setScope(ContainerInterface::SCOPE_CONTAINER);
            $def->addMethodCall('setRedis', array($client));
            if ($cache['namespace']) {
                $def->addMethodCall('setNamespace', array($cache['namespace']));
            }
            $container->setDefinition(sprintf('doctrine.orm.%s_%s', $em, $name), $def);
        }
        foreach ($cache['document_managers'] as $dm) {
            $def = new Definition($container->getParameter('snc_redis.doctrine_cache.class'));
            $def->setScope(ContainerInterface::SCOPE_CONTAINER);
            $def->addMethodCall('setRedis', array($client));
            if ($cache['namespace']) {
                $def->addMethodCall('setNamespace', array($cache['namespace']));
            }
            $container->setDefinition(sprintf('doctrine.odm.mongodb.%s_%s', $dm, $name), $def);
            //PHPCR metadata definition override
            $container->setDefinition(sprintf('doctrine_phpcr.odm.%s_%s', $dm, $name), $def);
        }
    }
}

This works for overriding the metadata cache and I can see in the Redis database that the metadata entries get populated.

Now I want to override the nodes result cache but I can't seem to find a way to do that. I cannot find the service definition name to use for the override. Can anyone point me in the right direction for this?

2

There are 2 best solutions below

0
On BEST ANSWER

I managed to override the meta and nodes cache by digging into the container and looking at the provided services. The code in Snc\RedisBundle\DependencyInjection\SncRedisExtension.php has been reverted and only the config.yml file had to be modified.

SncRedis overrides Doctrine's cache provider and since I wanted to use the same provider, I only had to set the meta to doctrine.orm.default_metadata_cache and nodes to doctrine.orm.default_result_cache.

After that all doctrine meta and nodes result cache was being populated to my Redis server. Full configuration below:

doctrine_phpcr:
    session:
        backend:
            type: doctrinedbal
            connection: default
            caches:
                meta: doctrine.orm.default_metadata_cache
                nodes: doctrine.orm.default_result_cache
        workspace: default
        username: admin
        password: admin
    odm:
        auto_mapping: true
        auto_generate_proxy_classes: "%kernel.debug%"
2
On

Yeah you essentially configure the full service names in the caches config option.