PHPCR 节点和元缓存覆盖
PHPCR nodes and meta cache override
我正在使用 Symfony CMF、PHPCR 和 SncRedisBundle。我想将 PHPCR 的元数据和节点缓存添加到 SncRedisBundle。
出于测试目的,我修改了文件 Snc\RedisBundle\DependencyInjection\SncRedisExtension.php 中的 loadDoctrine 函数(有关我添加的代码,请参阅评论 "PHPCR metadata definition override",第 1 行)。
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);
}
}
}
这适用于覆盖元数据缓存,我可以在 Redis 数据库中看到元数据条目已填充。
现在我想覆盖节点结果缓存,但我似乎找不到实现该操作的方法。我找不到用于覆盖的服务定义名称。谁能为此指出正确的方向?
我通过深入了解容器并查看所提供的服务,设法覆盖了元数据和节点缓存。 Snc\RedisBundle\DependencyInjection\SncRedisExtension.php 中的代码已恢复,只有 config.yml 文件需要修改。
SncRedis 覆盖了 Doctrine 的缓存提供者,因为我想使用相同的提供者,我只需要将元设置为 doctrine.orm.default_metadata_cache 并将节点设置为 doctrine.orm.default_result_cache.
之后,所有学说元数据和节点结果缓存都被填充到我的 Redis 服务器。完整配置如下:
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%"
是的,您实际上是在 caches
配置选项中配置了完整的服务名称。
我正在使用 Symfony CMF、PHPCR 和 SncRedisBundle。我想将 PHPCR 的元数据和节点缓存添加到 SncRedisBundle。
出于测试目的,我修改了文件 Snc\RedisBundle\DependencyInjection\SncRedisExtension.php 中的 loadDoctrine 函数(有关我添加的代码,请参阅评论 "PHPCR metadata definition override",第 1 行)。
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);
}
}
}
这适用于覆盖元数据缓存,我可以在 Redis 数据库中看到元数据条目已填充。
现在我想覆盖节点结果缓存,但我似乎找不到实现该操作的方法。我找不到用于覆盖的服务定义名称。谁能为此指出正确的方向?
我通过深入了解容器并查看所提供的服务,设法覆盖了元数据和节点缓存。 Snc\RedisBundle\DependencyInjection\SncRedisExtension.php 中的代码已恢复,只有 config.yml 文件需要修改。
SncRedis 覆盖了 Doctrine 的缓存提供者,因为我想使用相同的提供者,我只需要将元设置为 doctrine.orm.default_metadata_cache 并将节点设置为 doctrine.orm.default_result_cache.
之后,所有学说元数据和节点结果缓存都被填充到我的 Redis 服务器。完整配置如下:
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%"
是的,您实际上是在 caches
配置选项中配置了完整的服务名称。