1
0
mirror of synced 2025-02-02 13:31:45 +03:00

Change the test listener than layers on second-level-caching so that it is more conservative, only turning on caching-associations when it knows the target entity is cache-able.

This commit is contained in:
Darien Hager 2015-04-10 16:02:38 -07:00 committed by Marco Pivetta
parent 768c291cd1
commit d29cc3660f

View File

@ -3,33 +3,74 @@
namespace Doctrine\Tests\EventListener; namespace Doctrine\Tests\EventListener;
use Doctrine\Common\Persistence\Event\LoadClassMetadataEventArgs; use Doctrine\Common\Persistence\Event\LoadClassMetadataEventArgs;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\ClassMetadata; use Doctrine\ORM\Mapping\ClassMetadata;
class CacheMetadataListener class CacheMetadataListener
{ {
/**
* Tracks which entities we have already forced caching enabled on. This is
* important to avoid some potential infinite-recursion issues.
* @var array
*/
protected $enabledItems = array();
/** /**
* @param \Doctrine\Common\Persistence\Event\LoadClassMetadataEventArgs $event * @param \Doctrine\Common\Persistence\Event\LoadClassMetadataEventArgs $event
*/ */
public function loadClassMetadata(LoadClassMetadataEventArgs $event) public function loadClassMetadata(LoadClassMetadataEventArgs $event)
{ {
$metadata = $event->getClassMetadata(); $metadata = $event->getClassMetadata();
$cache = array( $em = $event->getObjectManager();
'usage' => ClassMetadata::CACHE_USAGE_NONSTRICT_READ_WRITE
);
/** @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */ /** @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */
if (strstr($metadata->name, 'Doctrine\Tests\Models\Cache')) { if (strstr($metadata->name, 'Doctrine\Tests\Models\Cache')) {
return; return;
} }
if( ! $em instanceof EntityManager){
return;
}
$this->enableCaching($metadata, $em);
}
/**
* @param ClassMetadata $metadata
* @param EntityManager $em
*/
protected function enableCaching(ClassMetadata $metadata, EntityManager $em){
if(array_key_exists($metadata->getName(), $this->enabledItems)){
return; // Already handled in the past
}
$cache = array(
'usage' => ClassMetadata::CACHE_USAGE_NONSTRICT_READ_WRITE
);
if ($metadata->isVersioned) { if ($metadata->isVersioned) {
return; return;
} }
$metadata->enableCache($cache); $metadata->enableCache($cache);
$this->enabledItems[$metadata->getName()] = $metadata;
/*
* Only enable association-caching when the target has already been
* given caching settings
*/
foreach ($metadata->associationMappings as $mapping) { foreach ($metadata->associationMappings as $mapping) {
$metadata->enableAssociationCache($mapping['fieldName'], $cache);
$targetMeta = $em->getClassMetadata($mapping['targetEntity']);
$this->enableCaching($targetMeta, $em);
if(array_key_exists($targetMeta->getName(), $this->enabledItems)){
$metadata->enableAssociationCache($mapping['fieldName'], $cache);
}
} }
} }
} }