Skip to content

Commit

Permalink
Add PhpArrayAdapter to cache metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
ossinkine committed Aug 20, 2020
1 parent b74e72c commit 1f069b9
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 3 deletions.
39 changes: 39 additions & 0 deletions CacheWarmer/DoctrineMetadataCacheWarmer.php
@@ -0,0 +1,39 @@
<?php

namespace Doctrine\Bundle\DoctrineBundle\CacheWarmer;

use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Mapping\ClassMetadataFactory;
use Symfony\Bundle\FrameworkBundle\CacheWarmer\AbstractPhpFileCacheWarmer;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Cache\DoctrineProvider;

class DoctrineMetadataCacheWarmer extends AbstractPhpFileCacheWarmer
{
/**
* @var EntityManagerInterface
*/
private $entityManager;

public function __construct(EntityManagerInterface $entityManager, string $phpArrayFile)
{
$this->entityManager = $entityManager;

parent::__construct($phpArrayFile);
}

/**
* @param string $cacheDir
*
* @return bool false if there is nothing to warm-up
*/
protected function doWarmUp($cacheDir, ArrayAdapter $arrayAdapter)
{
$metadataFactory = new ClassMetadataFactory();
$metadataFactory->setEntityManager($this->entityManager);
$metadataFactory->setCacheDriver(new DoctrineProvider($arrayAdapter));
$metadataFactory->getAllMetadata();

return true;
}
}
37 changes: 37 additions & 0 deletions DependencyInjection/DoctrineExtension.php
Expand Up @@ -2,6 +2,7 @@

namespace Doctrine\Bundle\DoctrineBundle\DependencyInjection;

use Doctrine\Bundle\DoctrineBundle\CacheWarmer\DoctrineMetadataCacheWarmer;
use Doctrine\Bundle\DoctrineBundle\Dbal\RegexSchemaAssetFilter;
use Doctrine\Bundle\DoctrineBundle\DependencyInjection\Compiler\ServiceRepositoryCompilerPass;
use Doctrine\Bundle\DoctrineBundle\EventSubscriber\EventSubscriberInterface;
Expand All @@ -17,6 +18,8 @@
use Symfony\Bridge\Doctrine\SchemaListener\PdoCacheAdapterDoctrineSchemaSubscriber;
use Symfony\Bridge\Doctrine\Validator\DoctrineLoader;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Cache\Adapter\DoctrineAdapter;
use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
use Symfony\Component\Cache\DoctrineProvider;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Alias;
Expand Down Expand Up @@ -778,6 +781,11 @@ protected function loadOrmCacheDrivers(array $entityManager, ContainerBuilder $c
$this->loadCacheDriver('metadata_cache', $entityManager['name'], $entityManager['metadata_cache_driver'], $container);
$this->loadCacheDriver('result_cache', $entityManager['name'], $entityManager['result_cache_driver'], $container);
$this->loadCacheDriver('query_cache', $entityManager['name'], $entityManager['query_cache_driver'], $container);

if (!$container->getParameter('kernel.debug')) {
$this->registerMetadataPhpArrayCacheWarmer($entityManager['name'], $container);
$this->registerMetadataPhpArrayCache($entityManager['name'], $container);
}
}

/**
Expand Down Expand Up @@ -898,4 +906,33 @@ private function createArrayAdapterCachePool(ContainerBuilder $container, string

return $id;
}

private function registerMetadataPhpArrayCacheWarmer(string $entityManagerName, ContainerBuilder $container): void
{
$cacheWarmerDefinition = $container->register(sprintf('doctrine.orm.%s_metadata_cache.php_array_warmer', $entityManagerName), DoctrineMetadataCacheWarmer::class);
$cacheWarmerDefinition->setArguments([
new Reference(sprintf('doctrine.orm.%s_entity_manager', $entityManagerName)),
$this->getPhpArrayFile($entityManagerName)
]);
$cacheWarmerDefinition->addTag('kernel.cache_warmer');
}

private function registerMetadataPhpArrayCache(string $entityManagerName, ContainerBuilder $container): void
{
$aliasId = sprintf('doctrine.orm.%s_metadata_cache', $entityManagerName);
$serviceId = (string) $container->getAlias($aliasId);
$phpArrayAdapterDefinition = new Definition(PhpArrayAdapter::class, [
$this->getPhpArrayFile($entityManagerName),
new Definition(DoctrineAdapter::class, [new Reference($serviceId)]),
]);
$serviceId = $serviceId.'.php_array';
$doctrineCacheDefinition = $container->register($serviceId, DoctrineProvider::class);
$doctrineCacheDefinition->addArgument($phpArrayAdapterDefinition);
$container->setAlias($aliasId, $serviceId);
}

private function getPhpArrayFile(string $entityManagerName): string
{
return '%kernel.cache_dir%'.sprintf('/doctrine/orm/%s_metadata.php', $entityManagerName);
}
}
20 changes: 17 additions & 3 deletions Tests/DependencyInjection/DoctrineExtensionTest.php
Expand Up @@ -11,6 +11,8 @@
use PHPUnit\Framework\TestCase;
use Symfony\Bridge\Doctrine\Messenger\DoctrineClearEntityManagerWorkerSubscriber;
use Symfony\Component\Cache\Adapter\ArrayAdapter;
use Symfony\Component\Cache\Adapter\DoctrineAdapter;
use Symfony\Component\Cache\Adapter\PhpArrayAdapter;
use Symfony\Component\Cache\DoctrineProvider;
use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
Expand Down Expand Up @@ -326,6 +328,18 @@ public function testDependencyInjectionConfigurationDefaults() : void
$definition = $container->getDefinition((string) $container->getAlias('doctrine.orm.default_metadata_cache'));
$this->assertEquals(DoctrineProvider::class, $definition->getClass());
$arguments = $definition->getArguments();
$this->assertInstanceOf(Definition::class, $arguments[0]);
$this->assertEquals(PhpArrayAdapter::class, $arguments[0]->getClass());
$arguments = $arguments[0]->getArguments();
$this->assertSame('%kernel.cache_dir%/doctrine/orm/default_metadata.php', $arguments[0]);
$this->assertInstanceOf(Definition::class, $arguments[1]);
$this->assertEquals(DoctrineAdapter::class, $arguments[1]->getClass());
$arguments = $arguments[1]->getArguments();
$this->assertInstanceOf(Reference::class, $arguments[0]);
$this->assertEquals('doctrine.orm.cache.provider.cache.doctrine.orm.default.metadata', (string) $arguments[0]);
$definition = $container->getDefinition((string) $arguments[0]);
$this->assertEquals(DoctrineProvider::class, $definition->getClass());
$arguments = $definition->getArguments();
$this->assertInstanceOf(Reference::class, $arguments[0]);
$this->assertEquals('cache.doctrine.orm.default.metadata', (string) $arguments[0]);
$this->assertSame(ArrayAdapter::class, $container->getDefinition((string) $arguments[0])->getClass());
Expand Down Expand Up @@ -730,7 +744,7 @@ public static function cacheConfigurationProvider() : array
return [
'metadata_cache_default' => [
'expectedAliasName' => 'doctrine.orm.default_metadata_cache',
'expectedAliasTarget' => 'doctrine.orm.cache.provider.cache.doctrine.orm.default.metadata',
'expectedAliasTarget' => 'doctrine.orm.cache.provider.cache.doctrine.orm.default.metadata.php_array',
'cacheName' => 'metadata_cache_driver',
'cacheConfig' => ['type' => null],
],
Expand All @@ -749,7 +763,7 @@ public static function cacheConfigurationProvider() : array

'metadata_cache_pool' => [
'expectedAliasName' => 'doctrine.orm.default_metadata_cache',
'expectedAliasTarget' => 'doctrine.orm.cache.provider.metadata_cache_pool',
'expectedAliasTarget' => 'doctrine.orm.cache.provider.metadata_cache_pool.php_array',
'cacheName' => 'metadata_cache_driver',
'cacheConfig' => ['type' => 'pool', 'pool' => 'metadata_cache_pool'],
],
Expand All @@ -768,7 +782,7 @@ public static function cacheConfigurationProvider() : array

'metadata_cache_service' => [
'expectedAliasName' => 'doctrine.orm.default_metadata_cache',
'expectedAliasTarget' => 'service_target_metadata',
'expectedAliasTarget' => 'service_target_metadata.php_array',
'cacheName' => 'metadata_cache_driver',
'cacheConfig' => ['type' => 'service', 'id' => 'service_target_metadata'],
],
Expand Down

0 comments on commit 1f069b9

Please sign in to comment.