Skip to content

Commit

Permalink
Avoid using reserved characters in PSR-6 cache keys (#70)
Browse files Browse the repository at this point in the history
  • Loading branch information
mpdude authored Apr 26, 2024
1 parent 9c3420b commit 7f3fdbb
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions src/Doctrine/PolyglotListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,8 @@ private function loadTranslationMetadataForClass($className, EntityManager $em):
$cacheDriver = $em->getConfiguration()->getMetadataCacheImpl();

if ($cacheDriver) {
if (($data = $cacheDriver->fetch($className.self::CACHE_SALT)) !== false) {
$cacheKey = $this->getCacheKey($className);
if (($data = $cacheDriver->fetch($cacheKey)) !== false) {
if (null === $data) {
$this->translatedClasses[$className] = null;

Expand All @@ -164,8 +165,19 @@ private function loadTranslationMetadataForClass($className, EntityManager $em):
}

// Save if cache driver available
$cacheDriver?->save($className.self::CACHE_SALT, $meta?->sleep());
$cacheDriver?->save($cacheKey, $meta?->sleep());

return $meta;
}

// this is taken from \Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory::escapeClassName
private function getCacheKey(string $class): string
{
if (str_contains($class, '@')) {
// anonymous class: replace all PSR6-reserved characters
return str_replace(["\0", '\\', '/', '@', ':', '{', '}', '(', ')'], '.', $class).self::CACHE_SALT;
}

return str_replace('\\', '.', $class).self::CACHE_SALT;
}
}

0 comments on commit 7f3fdbb

Please sign in to comment.