diff --git a/src/Symfony/Component/Cache/LockRegistry.php b/src/Symfony/Component/Cache/LockRegistry.php index 3fa8bb8512..81f7db459f 100644 --- a/src/Symfony/Component/Cache/LockRegistry.php +++ b/src/Symfony/Component/Cache/LockRegistry.php @@ -23,7 +23,7 @@ use Symfony\Contracts\Cache\ItemInterface; * * @author Nicolas Grekas */ -class LockRegistry +final class LockRegistry { private static $openedFiles = []; private static $lockedFiles = []; @@ -75,7 +75,7 @@ class LockRegistry return $previousFiles; } - public static function compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool) + public static function compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata = null) { $key = self::$files ? crc32($item->getKey()) % \count(self::$files) : -1; @@ -89,7 +89,18 @@ class LockRegistry if (flock($lock, LOCK_EX | LOCK_NB)) { self::$lockedFiles[$key] = true; - return $callback($item, $save); + $value = $callback($item, $save); + + if ($save) { + if ($setMetadata) { + $setMetadata($item); + } + + $pool->save($item->set($value)); + $save = false; + } + + return $value; } // if we failed the race, retry locking in blocking mode to wait for the winner flock($lock, LOCK_SH); @@ -126,6 +137,6 @@ class LockRegistry restore_error_handler(); } - self::$openedFiles[$key] = $h ?: @fopen(self::$files[$key], 'r'); + return self::$openedFiles[$key] = $h ?: @fopen(self::$files[$key], 'r'); } } diff --git a/src/Symfony/Component/Cache/Traits/ContractsTrait.php b/src/Symfony/Component/Cache/Traits/ContractsTrait.php index 8b1eb5a244..bd7be08dd5 100644 --- a/src/Symfony/Component/Cache/Traits/ContractsTrait.php +++ b/src/Symfony/Component/Cache/Traits/ContractsTrait.php @@ -40,7 +40,7 @@ trait ContractsTrait public function setCallbackWrapper(?callable $callbackWrapper): callable { $previousWrapper = $this->callbackWrapper; - $this->callbackWrapper = $callbackWrapper ?? function (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool) { + $this->callbackWrapper = $callbackWrapper ?? function (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata) { return $callback($item, $save); }; @@ -56,17 +56,19 @@ trait ContractsTrait static $setMetadata; $setMetadata = $setMetadata ?? \Closure::bind( - function (AdapterInterface $pool, ItemInterface $item, float $startTime) { + function (CacheItem $item, float $startTime, ?array &$metadata) { if ($item->expiry > $endTime = microtime(true)) { - $item->newMetadata[ItemInterface::METADATA_EXPIRY] = $item->expiry; - $item->newMetadata[ItemInterface::METADATA_CTIME] = 1000 * (int) ($endTime - $startTime); + $item->newMetadata[CacheItem::METADATA_EXPIRY] = $metadata[CacheItem::METADATA_EXPIRY] = $item->expiry; + $item->newMetadata[CacheItem::METADATA_CTIME] = $metadata[CacheItem::METADATA_CTIME] = 1000 * (int) ($endTime - $startTime); + } else { + unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::METADATA_CTIME]); } }, null, CacheItem::class ); - return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata) { + return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata, &$metadata) { // don't wrap nor save recursive calls if (null === $callbackWrapper = $this->callbackWrapper) { $value = $callback($item, $save); @@ -78,8 +80,10 @@ trait ContractsTrait $startTime = microtime(true); try { - $value = $callbackWrapper($callback, $item, $save, $pool); - $setMetadata($pool, $item, $startTime); + $value = $callbackWrapper($callback, $item, $save, $pool, function (CacheItem $item) use ($setMetadata, $startTime, &$metadata) { + $setMetadata($item, $startTime, $metadata); + }); + $setMetadata($item, $startTime, $metadata); return $value; } finally { diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php index 7f44aab1d5..7cf2120a51 100644 --- a/src/Symfony/Component/HttpFoundation/Request.php +++ b/src/Symfony/Component/HttpFoundation/Request.php @@ -1330,7 +1330,7 @@ class Request * * @param string|null $default The default format * - * @return string The request format + * @return string|null The request format */ public function getRequestFormat($default = 'html') { diff --git a/src/Symfony/Component/Security/Core/Resources/translations/security.ua.xlf b/src/Symfony/Component/Security/Core/Resources/translations/security.uk.xlf similarity index 100% rename from src/Symfony/Component/Security/Core/Resources/translations/security.ua.xlf rename to src/Symfony/Component/Security/Core/Resources/translations/security.uk.xlf diff --git a/src/Symfony/Component/Validator/Mapping/Cache/Psr6Cache.php b/src/Symfony/Component/Validator/Mapping/Cache/Psr6Cache.php index c0266e65a5..7d1cdd8003 100644 --- a/src/Symfony/Component/Validator/Mapping/Cache/Psr6Cache.php +++ b/src/Symfony/Component/Validator/Mapping/Cache/Psr6Cache.php @@ -66,6 +66,11 @@ class Psr6Cache implements CacheInterface */ private function escapeClassName(string $class): string { + if (false !== strpos($class, '@')) { + // anonymous class: replace all PSR6-reserved characters + return str_replace(["\0", '\\', '/', '@', ':', '{', '}', '(', ')'], '.', $class); + } + return str_replace('\\', '.', $class); } } diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf index bd09da5d0e..1db88086cf 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.bg.xlf @@ -36,23 +36,23 @@ This field was not expected. - Това поле не се е очаквало. + Полето не се е очаквало. This field is missing. - Това поле липсва. + Полето липсва. This value is not a valid date. - Стойността не е валидна дата (date). + Стойността не е валидна дата. This value is not a valid datetime. - Стойността не е валидна дата (datetime). + Стойността не е валидна дата и час. This value is not a valid email address. - Стойността не е валиден email адрес. + Стойността не е валиден имейл адрес. The file could not be found. @@ -68,7 +68,7 @@ The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}. - Майм типа на файла е невалиден ({{ type }}). Разрешени майм типове са {{ types }}. + Mime типа на файла е невалиден ({{ type }}). Разрешени mime типове са {{ types }}. This value should be {{ limit }} or less. @@ -104,7 +104,7 @@ This value is not a valid time. - Стойността не е валидно време (time). + Стойността не е валидно време. This value is not a valid URL. @@ -216,35 +216,35 @@ Invalid card number. - Невалиден номер на картата. + Невалиден номер на карта. Unsupported card type or invalid card number. - Неподдържан тип карта или невалиден номер на картата. + Неподдържан тип карта или невалиден номер на карта. This is not a valid International Bank Account Number (IBAN). - Невалиден Международен номер на банкова сметка (IBAN). + Това не е валиден Международен номер на банкова сметка (IBAN). This value is not a valid ISBN-10. - Невалиден ISBN-10. + Стойността не е валиден ISBN-10. This value is not a valid ISBN-13. - Невалиден ISBN-13. + Стойността не е валиден ISBN-13. This value is neither a valid ISBN-10 nor a valid ISBN-13. - Невалидна стойност както за ISBN-10, така и за ISBN-13 . + Стойността не е нито валиден ISBN-10, нито валиден ISBN-13. This value is not a valid ISSN. - Невалиден Международен стандартен сериен номер (ISSN). + Стойността не е валиден ISSN. This value is not a valid currency. - Невалидна валута. + Стойността не е валидна валута. This value should be equal to {{ compared_value }}. @@ -308,11 +308,11 @@ This value does not match the expected {{ charset }} charset. - Стойността не съвпада с {{ charset }}. + Стойността не съвпада с очакваната {{ charset }} кодировка. This is not a valid Business Identifier Code (BIC). - Невалиден бизнес идентификационен код (BIC). + Това не е валиден Бизнес идентификационен код (BIC). Error @@ -324,15 +324,15 @@ This value should be a multiple of {{ compared_value }}. - Тази стойност трябва да бъде кратно число на {{ compared_value }}. + Стойността трябва да бъде кратно число на {{ compared_value }}. This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}. - Този бизнес идентификационен код (BIC) не е свързана с IBAN {{ iban }}. + Бизнес идентификационния код (BIC) не е свързан с IBAN {{ iban }}. This value should be valid JSON. - Тази стойност трябва да е валидна JSON. + Стойността трябва да е валиден JSON. diff --git a/src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf b/src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf index 4b966698f7..e637d09aa9 100644 --- a/src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf +++ b/src/Symfony/Component/Validator/Resources/translations/validators.cs.xlf @@ -318,6 +318,22 @@ Error Chyba + + This is not a valid UUID. + Tato hodnota není platné UUID. + + + This value should be a multiple of {{ compared_value }}. + Tato hodnota musí být násobek hodnoty {{ compared_value }}. + + + This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}. + Bankovní identifikační kód (BIC) neodpovídá mezinárodnímu číslu účtu (IBAN) {{ iban }}. + + + This value should be valid JSON. + Tato hodnota musí být validní JSON. + diff --git a/src/Symfony/Component/Validator/Tests/Mapping/Cache/Psr6CacheTest.php b/src/Symfony/Component/Validator/Tests/Mapping/Cache/Psr6CacheTest.php index c11dddbf6f..fcac5e232a 100644 --- a/src/Symfony/Component/Validator/Tests/Mapping/Cache/Psr6CacheTest.php +++ b/src/Symfony/Component/Validator/Tests/Mapping/Cache/Psr6CacheTest.php @@ -23,4 +23,12 @@ class Psr6CacheTest extends AbstractCacheTest $this->cache->write($metadata); $this->assertFalse($this->cache->has('Foo_Bar')); } + + public function testNameWithInvalidChars() + { + $metadata = new ClassMetadata('class@anonymous/path/file'); + + $this->cache->write($metadata); + $this->assertTrue($this->cache->has('class@anonymous/path/file')); + } }