diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index 383bbfdbb6493..0000000000000 --- a/.appveyor.yml +++ /dev/null @@ -1,70 +0,0 @@ -build: false -clone_depth: 2 -clone_folder: c:\projects\symfony -image: Visual Studio 2019 - -init: - - SET PATH=c:\php;%PATH% - - SET COMPOSER_NO_INTERACTION=1 - - SET SYMFONY_DEPRECATIONS_HELPER=strict - - SET ANSICON=121x90 (121x90) - - SET SYMFONY_PHPUNIT_DISABLE_RESULT_CACHE=1 - - REG ADD "HKEY_CURRENT_USER\Software\Microsoft\Command Processor" /v DelayedExpansion /t REG_DWORD /d 1 /f - -install: - - mkdir c:\php && cd c:\php - - appveyor DownloadFile https://github.com/symfony/binary-utils/releases/download/v0.1/php-8.1.0-Win32-vs16-x86.zip - - 7z x php-8.1.0-Win32-vs16-x86.zip -y >nul - - cd ext - - appveyor DownloadFile https://github.com/symfony/binary-utils/releases/download/v0.1/php_apcu-5.1.21-8.1-ts-vs16-x86.zip - - 7z x php_apcu-5.1.21-8.1-ts-vs16-x86.zip -y >nul - - appveyor DownloadFile https://github.com/symfony/binary-utils/releases/download/v0.1/php_redis-5.3.7-8.1-ts-vs16-x86.zip - - 7z x php_redis-5.3.7-8.1-ts-vs16-x86.zip -y >nul - - cd .. - - copy /Y php.ini-development php.ini-min - - echo memory_limit=-1 >> php.ini-min - - echo serialize_precision=-1 >> php.ini-min - - echo max_execution_time=1200 >> php.ini-min - - echo post_max_size=4G >> php.ini-min - - echo upload_max_filesize=4G >> php.ini-min - - echo date.timezone="America/Los_Angeles" >> php.ini-min - - echo extension_dir=ext >> php.ini-min - - echo extension=php_xsl.dll >> php.ini-min - - copy /Y php.ini-min php.ini-max - - echo zend_extension=php_opcache.dll >> php.ini-max - - echo opcache.enable_cli=1 >> php.ini-max - - echo extension=php_openssl.dll >> php.ini-max - - echo extension=php_apcu.dll >> php.ini-max - - echo extension=php_redis.dll >> php.ini-max - - echo apc.enable_cli=1 >> php.ini-max - - echo extension=php_intl.dll >> php.ini-max - - echo extension=php_mbstring.dll >> php.ini-max - - echo extension=php_fileinfo.dll >> php.ini-max - - echo extension=php_pdo_sqlite.dll >> php.ini-max - - echo extension=php_curl.dll >> php.ini-max - - echo extension=php_sodium.dll >> php.ini-max - - copy /Y php.ini-max php.ini - - cd c:\projects\symfony - - appveyor DownloadFile https://getcomposer.org/download/latest-stable/composer.phar - - mkdir %APPDATA%\Composer && copy /Y .github\composer-config.json %APPDATA%\Composer\config.json - - git config --global user.email "" - - git config --global user.name "Symfony" - - FOR /F "tokens=* USEBACKQ" %%F IN (`bash -c "grep ' VERSION = ' src/Symfony/Component/HttpKernel/Kernel.php | grep -o '[0-9][0-9]*\.[0-9]'"`) DO (SET SYMFONY_VERSION=%%F) - - php .github/build-packages.php HEAD^ %SYMFONY_VERSION% src\Symfony\Bridge\PhpUnit - - SET COMPOSER_ROOT_VERSION=%SYMFONY_VERSION%.x-dev - - php composer.phar update --no-progress --ansi - - php phpunit install - - choco install memurai-developer - -test_script: - - SET X=0 - - SET SYMFONY_PHPUNIT_SKIPPED_TESTS=phpunit.skipped - - copy /Y c:\php\php.ini-min c:\php\php.ini - - IF %APPVEYOR_REPO_BRANCH:~-2% neq .x (rm -Rf src\Symfony\Bridge\PhpUnit) - - mv src\Symfony\Component\HttpClient\phpunit.xml.dist src\Symfony\Component\HttpClient\phpunit.xml - - php phpunit src\Symfony --exclude-group tty,benchmark,intl-data,network,transient-on-windows || SET X=!errorlevel! - - php phpunit src\Symfony\Component\HttpClient || SET X=!errorlevel! - - copy /Y c:\php\php.ini-max c:\php\php.ini - - php phpunit src\Symfony --exclude-group tty,benchmark,intl-data,network,transient-on-windows || SET X=!errorlevel! - - php phpunit src\Symfony\Component\HttpClient || SET X=!errorlevel! - - exit %X% diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000000000..3abf4c17ca7b5 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,4 @@ +# Apply php-cs-fixer fix --rules nullable_type_declaration_for_default_null_value +f4118e110a46de3ffb799e7d79bf15128d1646ea +9519b54417c09c49496a4a6be238e63be9a73465 +ae0a783425b80b78376488619bf9106e69193fa4 diff --git a/.gitattributes b/.gitattributes index d1570aff1cd79..e58cd0bb1cd9e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,3 +6,5 @@ /src/Symfony/Component/Runtime export-ignore /src/Symfony/Component/Translation/Bridge export-ignore /src/Symfony/Component/Intl/Resources/data/*/* linguist-generated=true +/src/Symfony/**/.github/workflows/close-pull-request.yml linguist-generated=true +/src/Symfony/**/.github/PULL_REQUEST_TEMPLATE.md linguist-generated=true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index ff72a1cc13a5c..557eda9c29893 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,22 +1,25 @@ | Q | A | ------------- | --- -| Branch? | 6.4 for features / 5.4 or 6.3 for bug fixes +| Branch? | 7.4 for features / 6.4, 7.2, or 7.3 for bug fixes | Bug fix? | yes/no -| New feature? | yes/no -| Deprecations? | yes/no -| Issues | Fix #... +| New feature? | yes/no +| Deprecations? | yes/no +| Issues | Fix #... | License | MIT diff --git a/.github/build-packages.php b/.github/build-packages.php index d69a3c8198ec0..4793b8483d7ed 100644 --- a/.github/build-packages.php +++ b/.github/build-packages.php @@ -1,5 +1,15 @@ '__unset' !== $v); + }, []); + + return $expandedVersions ?? []; +} + if (3 > $_SERVER['argc']) { echo "Usage: branch version dir1 dir2 ... dirN\n"; exit(1); @@ -52,11 +62,13 @@ $packages[$package->name][$package->version] = $package; - $versions = @file_get_contents('https://repo.packagist.org/p/'.$package->name.'.json') ?: sprintf('{"packages":{"%s":{"%s":%s}}}', $package->name, $package->version, file_get_contents($dir.'/composer.json')); - $versions = json_decode($versions)->packages->{$package->name}; + foreach (['.json', '~dev.json'] as $ext) { + $versions = @file_get_contents('https://repo.packagist.org/p2/'.$package->name.$ext) ?: '[]'; + $versions = json_decode($versions, true)['packages'][$package->name] ?? []; - foreach ($versions as $v => $package) { - $packages[$package->name] += [$v => $package]; + foreach (expandComposerMetadata($versions) as $p) { + $packages[$package->name] += [$p['version'] => $p]; + } } } diff --git a/.github/expected-missing-return-types.diff b/.github/expected-missing-return-types.diff index 20e75c16130bd..a9b6f3b22ca03 100644 --- a/.github/expected-missing-return-types.diff +++ b/.github/expected-missing-return-types.diff @@ -1,5 +1,5 @@ # Run these steps to update this file: -sed -i 's/ *"\*\*\/Tests\/"//' composer.json +sed -i 's/ *"\*\*\/Tests\/",//' composer.json composer u -o SYMFONY_PATCH_TYPE_DECLARATIONS='force=2&php=8.1' php .github/patch-types.php head=$(sed '/^diff /Q' .github/expected-missing-return-types.diff) @@ -20,8 +20,8 @@ diff --git a/src/Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php @@ -67,5 +67,5 @@ class DoctrineDataCollector extends DataCollector * @return void */ -- public function collect(Request $request, Response $response, \Throwable $exception = null) -+ public function collect(Request $request, Response $response, \Throwable $exception = null): void +- public function collect(Request $request, Response $response, ?\Throwable $exception = null) ++ public function collect(Request $request, Response $response, ?\Throwable $exception = null): void { $this->data = [ @@ -98,5 +98,5 @@ class DoctrineDataCollector extends DataCollector @@ -60,22 +60,12 @@ diff --git a/src/Symfony/Bridge/Doctrine/DataCollector/DoctrineDataCollector.php { return $this->data['queries']; @@ -149,5 +149,5 @@ class DoctrineDataCollector extends DataCollector - * @return int + * @return float */ - public function getTime() -+ public function getTime(): int ++ public function getTime(): float { $time = 0; -diff --git a/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php b/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php ---- a/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php -+++ b/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php -@@ -38,5 +38,5 @@ class ContainerAwareLoader extends Loader - * @return void - */ -- public function addFixture(FixtureInterface $fixture) -+ public function addFixture(FixtureInterface $fixture): void - { - if ($fixture instanceof ContainerAwareInterface) { diff --git a/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php b/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php --- a/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php +++ b/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php @@ -107,14 +97,14 @@ diff --git a/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExt + protected function registerMappingDrivers(array $objectManager, ContainerBuilder $container): void { // configure metadata driver for each bundle based on the type of mapping files found -@@ -238,5 +238,5 @@ abstract class AbstractDoctrineExtension extends Extension +@@ -240,5 +240,5 @@ abstract class AbstractDoctrineExtension extends Extension * @throws \InvalidArgumentException */ - protected function assertValidMappingConfiguration(array $mappingConfig, string $objectManagerName) + protected function assertValidMappingConfiguration(array $mappingConfig, string $objectManagerName): void { if (!$mappingConfig['type'] || !$mappingConfig['dir'] || !$mappingConfig['prefix']) { -@@ -328,5 +328,5 @@ abstract class AbstractDoctrineExtension extends Extension +@@ -330,5 +330,5 @@ abstract class AbstractDoctrineExtension extends Extension * @throws \InvalidArgumentException in case of unknown driver type */ - protected function loadObjectManagerCacheDriver(array $objectManager, ContainerBuilder $container, string $cacheName) @@ -154,7 +144,7 @@ diff --git a/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/Regist diff --git a/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php b/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php --- a/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php +++ b/src/Symfony/Bridge/Doctrine/Form/DoctrineOrmTypeGuesser.php -@@ -160,5 +160,5 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface +@@ -164,5 +164,5 @@ class DoctrineOrmTypeGuesser implements FormTypeGuesserInterface * @return array{0:ClassMetadata, 1:string}|null */ - protected function getMetadata(string $class) @@ -225,14 +215,14 @@ diff --git a/src/Symfony/Bridge/Doctrine/Messenger/DoctrineClearEntityManagerWor diff --git a/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php b/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php --- a/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php +++ b/src/Symfony/Bridge/Doctrine/Security/RememberMe/DoctrineTokenProvider.php -@@ -70,5 +70,5 @@ class DoctrineTokenProvider implements TokenProviderInterface, TokenVerifierInte +@@ -72,5 +72,5 @@ class DoctrineTokenProvider implements TokenProviderInterface, TokenVerifierInte * @return void */ - public function deleteTokenBySeries(string $series) + public function deleteTokenBySeries(string $series): void { $sql = 'DELETE FROM rememberme_token WHERE series=:series'; -@@ -100,5 +100,5 @@ class DoctrineTokenProvider implements TokenProviderInterface, TokenVerifierInte +@@ -102,5 +102,5 @@ class DoctrineTokenProvider implements TokenProviderInterface, TokenVerifierInte * @return void */ - public function createNewToken(PersistentTokenInterface $token) @@ -262,7 +252,7 @@ diff --git a/src/Symfony/Bridge/Doctrine/Validator/DoctrineInitializer.php b/src diff --git a/src/Symfony/Bridge/Monolog/Command/ServerLogCommand.php b/src/Symfony/Bridge/Monolog/Command/ServerLogCommand.php --- a/src/Symfony/Bridge/Monolog/Command/ServerLogCommand.php +++ b/src/Symfony/Bridge/Monolog/Command/ServerLogCommand.php -@@ -54,5 +54,5 @@ class ServerLogCommand extends Command +@@ -56,5 +56,5 @@ class ServerLogCommand extends Command * @return void */ - protected function configure() @@ -482,7 +472,7 @@ diff --git a/src/Symfony/Bundle/DebugBundle/DependencyInjection/Compiler/DumpDat diff --git a/src/Symfony/Bundle/DebugBundle/DependencyInjection/DebugExtension.php b/src/Symfony/Bundle/DebugBundle/DependencyInjection/DebugExtension.php --- a/src/Symfony/Bundle/DebugBundle/DependencyInjection/DebugExtension.php +++ b/src/Symfony/Bundle/DebugBundle/DependencyInjection/DebugExtension.php -@@ -33,5 +33,5 @@ class DebugExtension extends Extension +@@ -32,5 +32,5 @@ class DebugExtension extends Extension * @return void */ - public function load(array $configs, ContainerBuilder $container) @@ -509,7 +499,7 @@ diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/AbstractConfigCommand.ph diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Application.php b/src/Symfony/Bundle/FrameworkBundle/Console/Application.php --- a/src/Symfony/Bundle/FrameworkBundle/Console/Application.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Application.php -@@ -174,5 +174,5 @@ class Application extends BaseApplication +@@ -180,5 +180,5 @@ class Application extends BaseApplication * @return void */ - protected function registerCommands() @@ -653,7 +643,7 @@ diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExt + public function load(array $configs, ContainerBuilder $container): void { $loader = new PhpFileLoader($container, new FileLocator(\dirname(__DIR__).'/Resources/config')); -@@ -2971,5 +2971,5 @@ class FrameworkExtension extends Extension +@@ -3007,5 +3007,5 @@ class FrameworkExtension extends Extension * @return void */ - public static function registerRateLimiter(ContainerBuilder $container, string $name, array $limiterConfig) @@ -663,14 +653,14 @@ diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExt diff --git a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php --- a/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php +++ b/src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php -@@ -95,5 +95,5 @@ class FrameworkBundle extends Bundle +@@ -97,5 +97,5 @@ class FrameworkBundle extends Bundle * @return void */ - public function boot() + public function boot(): void { $_ENV['DOCTRINE_DEPRECATIONS'] = $_SERVER['DOCTRINE_DEPRECATIONS'] ??= 'trigger'; -@@ -120,5 +120,5 @@ class FrameworkBundle extends Bundle +@@ -128,5 +128,5 @@ class FrameworkBundle extends Bundle * @return void */ - public function build(ContainerBuilder $container) @@ -1059,7 +1049,7 @@ diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/Configurator/Envi diff --git a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php --- a/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php +++ b/src/Symfony/Bundle/TwigBundle/DependencyInjection/TwigExtension.php -@@ -41,5 +41,5 @@ class TwigExtension extends Extension +@@ -42,5 +42,5 @@ class TwigExtension extends Extension * @return void */ - public function load(array $configs, ContainerBuilder $container) @@ -1220,8 +1210,8 @@ diff --git a/src/Symfony/Component/BrowserKit/CookieJar.php b/src/Symfony/Compon @@ -73,5 +73,5 @@ class CookieJar * @return void */ -- public function expire(string $name, ?string $path = '/', string $domain = null) -+ public function expire(string $name, ?string $path = '/', string $domain = null): void +- public function expire(string $name, ?string $path = '/', ?string $domain = null) ++ public function expire(string $name, ?string $path = '/', ?string $domain = null): void { $path ??= '/'; @@ -103,5 +103,5 @@ class CookieJar @@ -1234,15 +1224,15 @@ diff --git a/src/Symfony/Component/BrowserKit/CookieJar.php b/src/Symfony/Compon @@ -115,5 +115,5 @@ class CookieJar * @return void */ -- public function updateFromSetCookie(array $setCookies, string $uri = null) -+ public function updateFromSetCookie(array $setCookies, string $uri = null): void +- public function updateFromSetCookie(array $setCookies, ?string $uri = null) ++ public function updateFromSetCookie(array $setCookies, ?string $uri = null): void { $cookies = []; @@ -143,5 +143,5 @@ class CookieJar * @return void */ -- public function updateFromResponse(Response $response, string $uri = null) -+ public function updateFromResponse(Response $response, string $uri = null): void +- public function updateFromResponse(Response $response, ?string $uri = null) ++ public function updateFromResponse(Response $response, ?string $uri = null): void { $this->updateFromSetCookie($response->getHeader('Set-Cookie', false), $uri); @@ -217,5 +217,5 @@ class CookieJar @@ -1318,7 +1308,7 @@ diff --git a/src/Symfony/Component/Cache/Adapter/PdoAdapter.php b/src/Symfony/Co - public function createTable() + public function createTable(): void { - // connect if we are not yet + $sql = match ($driver = $this->getDriver()) { diff --git a/src/Symfony/Component/Cache/Adapter/PhpFilesAdapter.php b/src/Symfony/Component/Cache/Adapter/PhpFilesAdapter.php --- a/src/Symfony/Component/Cache/Adapter/PhpFilesAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/PhpFilesAdapter.php @@ -1339,14 +1329,14 @@ diff --git a/src/Symfony/Component/Cache/Adapter/PhpFilesAdapter.php b/src/Symfo diff --git a/src/Symfony/Component/Cache/Adapter/TagAwareAdapter.php b/src/Symfony/Component/Cache/Adapter/TagAwareAdapter.php --- a/src/Symfony/Component/Cache/Adapter/TagAwareAdapter.php +++ b/src/Symfony/Component/Cache/Adapter/TagAwareAdapter.php -@@ -283,5 +283,5 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac +@@ -287,5 +287,5 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac * @return void */ - public function reset() + public function reset(): void { $this->commit(); -@@ -299,5 +299,5 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac +@@ -303,5 +303,5 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac * @return void */ - public function __wakeup() @@ -1430,8 +1420,8 @@ diff --git a/src/Symfony/Component/Cache/Messenger/EarlyExpirationDispatcher.php @@ -38,5 +38,5 @@ class EarlyExpirationDispatcher * @return mixed */ -- public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, LoggerInterface $logger = null) -+ public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, LoggerInterface $logger = null): mixed +- public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger = null) ++ public function __invoke(callable $callback, CacheItem $item, bool &$save, AdapterInterface $pool, \Closure $setMetadata, ?LoggerInterface $logger = null): mixed { if (!$item->isHit() || null === $message = EarlyExpirationMessage::create($this->reverseContainer, $callback, $item, $pool)) { diff --git a/src/Symfony/Component/Cache/Messenger/EarlyExpirationHandler.php b/src/Symfony/Component/Cache/Messenger/EarlyExpirationHandler.php @@ -1464,7 +1454,7 @@ diff --git a/src/Symfony/Component/Cache/Traits/FilesystemCommonTrait.php b/src/ + protected function doUnlink(string $file): bool { return @unlink($file); -@@ -176,5 +176,5 @@ trait FilesystemCommonTrait +@@ -181,5 +181,5 @@ trait FilesystemCommonTrait * @return void */ - public function __wakeup() @@ -1487,8 +1477,8 @@ diff --git a/src/Symfony/Component/Config/ConfigCacheInterface.php b/src/Symfony @@ -44,4 +44,4 @@ interface ConfigCacheInterface * @throws \RuntimeException When the cache file cannot be written */ -- public function write(string $content, array $metadata = null); -+ public function write(string $content, array $metadata = null): void; +- public function write(string $content, ?array $metadata = null); ++ public function write(string $content, ?array $metadata = null): void; } diff --git a/src/Symfony/Component/Config/Definition/ArrayNode.php b/src/Symfony/Component/Config/Definition/ArrayNode.php --- a/src/Symfony/Component/Config/Definition/ArrayNode.php @@ -1735,35 +1725,35 @@ diff --git a/src/Symfony/Component/Config/Definition/Dumper/XmlReferenceDumper.p @@ -35,5 +35,5 @@ class XmlReferenceDumper * @return string */ -- public function dump(ConfigurationInterface $configuration, string $namespace = null) -+ public function dump(ConfigurationInterface $configuration, string $namespace = null): string +- public function dump(ConfigurationInterface $configuration, ?string $namespace = null) ++ public function dump(ConfigurationInterface $configuration, ?string $namespace = null): string { return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree(), $namespace); @@ -43,5 +43,5 @@ class XmlReferenceDumper * @return string */ -- public function dumpNode(NodeInterface $node, string $namespace = null) -+ public function dumpNode(NodeInterface $node, string $namespace = null): string +- public function dumpNode(NodeInterface $node, ?string $namespace = null) ++ public function dumpNode(NodeInterface $node, ?string $namespace = null): string { $this->reference = ''; diff --git a/src/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php b/src/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php --- a/src/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php +++ b/src/Symfony/Component/Config/Definition/Dumper/YamlReferenceDumper.php -@@ -34,5 +34,5 @@ class YamlReferenceDumper +@@ -33,5 +33,5 @@ class YamlReferenceDumper * @return string */ - public function dump(ConfigurationInterface $configuration) + public function dump(ConfigurationInterface $configuration): string { return $this->dumpNode($configuration->getConfigTreeBuilder()->buildTree()); -@@ -42,5 +42,5 @@ class YamlReferenceDumper +@@ -41,5 +41,5 @@ class YamlReferenceDumper * @return string */ - public function dumpAtPath(ConfigurationInterface $configuration, string $path) + public function dumpAtPath(ConfigurationInterface $configuration, string $path): string { $rootNode = $node = $configuration->getConfigTreeBuilder()->buildTree(); -@@ -71,5 +71,5 @@ class YamlReferenceDumper +@@ -70,5 +70,5 @@ class YamlReferenceDumper * @return string */ - public function dumpNode(NodeInterface $node) @@ -1942,21 +1932,21 @@ diff --git a/src/Symfony/Component/Config/Exception/LoaderLoadException.php b/sr diff --git a/src/Symfony/Component/Config/FileLocator.php b/src/Symfony/Component/Config/FileLocator.php --- a/src/Symfony/Component/Config/FileLocator.php +++ b/src/Symfony/Component/Config/FileLocator.php -@@ -34,5 +34,5 @@ class FileLocator implements FileLocatorInterface - * @return string|array +@@ -36,5 +36,5 @@ class FileLocator implements FileLocatorInterface + * @psalm-return ($first is true ? string : string[]) */ -- public function locate(string $name, string $currentPath = null, bool $first = true) -+ public function locate(string $name, string $currentPath = null, bool $first = true): string|array +- public function locate(string $name, ?string $currentPath = null, bool $first = true) ++ public function locate(string $name, ?string $currentPath = null, bool $first = true): string|array { if ('' === $name) { diff --git a/src/Symfony/Component/Config/FileLocatorInterface.php b/src/Symfony/Component/Config/FileLocatorInterface.php --- a/src/Symfony/Component/Config/FileLocatorInterface.php +++ b/src/Symfony/Component/Config/FileLocatorInterface.php -@@ -31,4 +31,4 @@ interface FileLocatorInterface - * @throws FileLocatorFileNotFoundException If a file is not found +@@ -33,4 +33,4 @@ interface FileLocatorInterface + * @psalm-return ($first is true ? string : string[]) */ -- public function locate(string $name, string $currentPath = null, bool $first = true); -+ public function locate(string $name, string $currentPath = null, bool $first = true): string|array; +- public function locate(string $name, ?string $currentPath = null, bool $first = true); ++ public function locate(string $name, ?string $currentPath = null, bool $first = true): string|array; } diff --git a/src/Symfony/Component/Config/Loader/FileLoader.php b/src/Symfony/Component/Config/Loader/FileLoader.php --- a/src/Symfony/Component/Config/Loader/FileLoader.php @@ -1971,8 +1961,8 @@ diff --git a/src/Symfony/Component/Config/Loader/FileLoader.php b/src/Symfony/Co @@ -71,5 +71,5 @@ abstract class FileLoader extends Loader * @throws FileLocatorFileNotFoundException */ -- public function import(mixed $resource, string $type = null, bool $ignoreErrors = false, string $sourceResource = null, string|array $exclude = null) -+ public function import(mixed $resource, string $type = null, bool $ignoreErrors = false, string $sourceResource = null, string|array $exclude = null): mixed +- public function import(mixed $resource, ?string $type = null, bool $ignoreErrors = false, ?string $sourceResource = null, string|array|null $exclude = null) ++ public function import(mixed $resource, ?string $type = null, bool $ignoreErrors = false, ?string $sourceResource = null, string|array|null $exclude = null): mixed { if (\is_string($resource) && \strlen($resource) !== ($i = strcspn($resource, '*?{[')) && !str_contains($resource, "\n")) { diff --git a/src/Symfony/Component/Config/Loader/Loader.php b/src/Symfony/Component/Config/Loader/Loader.php @@ -1988,8 +1978,8 @@ diff --git a/src/Symfony/Component/Config/Loader/Loader.php b/src/Symfony/Compon @@ -47,5 +47,5 @@ abstract class Loader implements LoaderInterface * @return mixed */ -- public function import(mixed $resource, string $type = null) -+ public function import(mixed $resource, string $type = null): mixed +- public function import(mixed $resource, ?string $type = null) ++ public function import(mixed $resource, ?string $type = null): mixed { return $this->resolve($resource, $type)->load($resource, $type); diff --git a/src/Symfony/Component/Config/Loader/LoaderInterface.php b/src/Symfony/Component/Config/Loader/LoaderInterface.php @@ -1998,15 +1988,15 @@ diff --git a/src/Symfony/Component/Config/Loader/LoaderInterface.php b/src/Symfo @@ -26,5 +26,5 @@ interface LoaderInterface * @throws \Exception If something went wrong */ -- public function load(mixed $resource, string $type = null); -+ public function load(mixed $resource, string $type = null): mixed; +- public function load(mixed $resource, ?string $type = null); ++ public function load(mixed $resource, ?string $type = null): mixed; /** @@ -35,5 +35,5 @@ interface LoaderInterface * @return bool */ -- public function supports(mixed $resource, string $type = null); -+ public function supports(mixed $resource, string $type = null): bool; +- public function supports(mixed $resource, ?string $type = null); ++ public function supports(mixed $resource, ?string $type = null): bool; /** @@ -42,5 +42,5 @@ interface LoaderInterface @@ -2038,8 +2028,8 @@ diff --git a/src/Symfony/Component/Config/ResourceCheckerConfigCache.php b/src/S @@ -110,5 +110,5 @@ class ResourceCheckerConfigCache implements ConfigCacheInterface * @throws \RuntimeException When cache file can't be written */ -- public function write(string $content, array $metadata = null) -+ public function write(string $content, array $metadata = null): void +- public function write(string $content, ?array $metadata = null) ++ public function write(string $content, ?array $metadata = null): void { $mode = 0666; diff --git a/src/Symfony/Component/Config/ResourceCheckerInterface.php b/src/Symfony/Component/Config/ResourceCheckerInterface.php @@ -2179,8 +2169,8 @@ diff --git a/src/Symfony/Component/Console/Application.php b/src/Symfony/Compone @@ -796,5 +796,5 @@ class Application implements ResetInterface * @return Command[] */ -- public function all(string $namespace = null) -+ public function all(string $namespace = null): array +- public function all(?string $namespace = null) ++ public function all(?string $namespace = null): array { $this->init(); @@ -940,5 +940,5 @@ class Application implements ResetInterface @@ -2210,8 +2200,8 @@ diff --git a/src/Symfony/Component/Console/Command/Command.php b/src/Symfony/Com @@ -153,5 +153,5 @@ class Command * @return void */ -- public function setApplication(Application $application = null) -+ public function setApplication(Application $application = null): void +- public function setApplication(?Application $application = null) ++ public function setApplication(?Application $application = null): void { if (1 > \func_num_args()) { @@ -171,5 +171,5 @@ class Command @@ -2382,15 +2372,15 @@ diff --git a/src/Symfony/Component/Console/Formatter/OutputFormatterStyle.php b/ @@ -42,5 +42,5 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface * @return void */ -- public function setForeground(string $color = null) -+ public function setForeground(string $color = null): void +- public function setForeground(?string $color = null) ++ public function setForeground(?string $color = null): void { if (1 > \func_num_args()) { @@ -53,5 +53,5 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface * @return void */ -- public function setBackground(string $color = null) -+ public function setBackground(string $color = null): void +- public function setBackground(?string $color = null) ++ public function setBackground(?string $color = null): void { if (1 > \func_num_args()) { @@ -69,5 +69,5 @@ class OutputFormatterStyle implements OutputFormatterStyleInterface @@ -2494,8 +2484,8 @@ diff --git a/src/Symfony/Component/Console/Helper/Helper.php b/src/Symfony/Compo @@ -27,5 +27,5 @@ abstract class Helper implements HelperInterface * @return void */ -- public function setHelperSet(HelperSet $helperSet = null) -+ public function setHelperSet(HelperSet $helperSet = null): void +- public function setHelperSet(?HelperSet $helperSet = null) ++ public function setHelperSet(?HelperSet $helperSet = null): void { if (1 > \func_num_args()) { @@ -95,5 +95,5 @@ abstract class Helper implements HelperInterface @@ -2541,8 +2531,8 @@ diff --git a/src/Symfony/Component/Console/Helper/HelperSet.php b/src/Symfony/Co @@ -39,5 +39,5 @@ class HelperSet implements \IteratorAggregate * @return void */ -- public function set(HelperInterface $helper, string $alias = null) -+ public function set(HelperInterface $helper, string $alias = null): void +- public function set(HelperInterface $helper, ?string $alias = null) ++ public function set(HelperInterface $helper, ?string $alias = null): void { $this->helpers[$helper->getName()] = $helper; diff --git a/src/Symfony/Component/Console/Helper/InputAwareHelper.php b/src/Symfony/Component/Console/Helper/InputAwareHelper.php @@ -2742,8 +2732,8 @@ diff --git a/src/Symfony/Component/Console/Input/InputArgument.php b/src/Symfony @@ -96,5 +96,5 @@ class InputArgument * @throws LogicException When incorrect default value is given */ -- public function setDefault(string|bool|int|float|array $default = null) -+ public function setDefault(string|bool|int|float|array $default = null): void +- public function setDefault(string|bool|int|float|array|null $default = null) ++ public function setDefault(string|bool|int|float|array|null $default = null): void { if (1 > \func_num_args()) { diff --git a/src/Symfony/Component/Console/Input/InputAwareInterface.php b/src/Symfony/Component/Console/Input/InputAwareInterface.php @@ -2871,8 +2861,8 @@ diff --git a/src/Symfony/Component/Console/Input/InputOption.php b/src/Symfony/C @@ -182,5 +182,5 @@ class InputOption * @return void */ -- public function setDefault(string|bool|int|float|array $default = null) -+ public function setDefault(string|bool|int|float|array $default = null): void +- public function setDefault(string|bool|int|float|array|null $default = null) ++ public function setDefault(string|bool|int|float|array|null $default = null): void { if (1 > \func_num_args()) { diff --git a/src/Symfony/Component/Console/Input/StreamableInputInterface.php b/src/Symfony/Component/Console/Input/StreamableInputInterface.php @@ -2942,8 +2932,8 @@ diff --git a/src/Symfony/Component/Console/Output/ConsoleSectionOutput.php b/src @@ -64,5 +64,5 @@ class ConsoleSectionOutput extends StreamOutput * @return void */ -- public function clear(int $lines = null) -+ public function clear(int $lines = null): void +- public function clear(?int $lines = null) ++ public function clear(?int $lines = null): void { if (empty($this->content) || !$this->isDecorated()) { @@ -87,5 +87,5 @@ class ConsoleSectionOutput extends StreamOutput @@ -3268,8 +3258,8 @@ diff --git a/src/Symfony/Component/Console/Style/SymfonyStyle.php b/src/Symfony/ @@ -64,5 +64,5 @@ class SymfonyStyle extends OutputStyle * @return void */ -- public function block(string|array $messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true) -+ public function block(string|array $messages, string $type = null, string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true): void +- public function block(string|array $messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true) ++ public function block(string|array $messages, ?string $type = null, ?string $style = null, string $prefix = ' ', bool $padding = false, bool $escape = true): void { $messages = \is_array($messages) ? array_values($messages) : [$messages]; @@ -76,5 +76,5 @@ class SymfonyStyle extends OutputStyle @@ -3776,7 +3766,7 @@ diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ReplaceAliasByAc diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php --- a/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ResolveBindingsPass.php -@@ -38,5 +38,5 @@ class ResolveBindingsPass extends AbstractRecursivePass +@@ -40,5 +40,5 @@ class ResolveBindingsPass extends AbstractRecursivePass * @return void */ - public function process(ContainerBuilder $container) @@ -3928,7 +3918,7 @@ diff --git a/src/Symfony/Component/DependencyInjection/Container.php b/src/Symfo + public function set(string $id, ?object $service): void { // Runs the internal initializer; used by the dumped container to include always-needed files -@@ -287,5 +287,5 @@ class Container implements ContainerInterface, ResetInterface +@@ -286,5 +286,5 @@ class Container implements ContainerInterface, ResetInterface * @return void */ - public function reset() @@ -3957,8 +3947,8 @@ diff --git a/src/Symfony/Component/DependencyInjection/ContainerAwareTrait.php b @@ -31,5 +31,5 @@ trait ContainerAwareTrait * @return void */ -- public function setContainer(ContainerInterface $container = null) -+ public function setContainer(ContainerInterface $container = null): void +- public function setContainer(?ContainerInterface $container = null) ++ public function setContainer(?ContainerInterface $container = null): void { if (1 > \func_num_args()) { diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -4088,7 +4078,7 @@ diff --git a/src/Symfony/Component/DependencyInjection/ContainerInterface.php b/ diff --git a/src/Symfony/Component/DependencyInjection/Exception/AutowiringFailedException.php b/src/Symfony/Component/DependencyInjection/Exception/AutowiringFailedException.php --- a/src/Symfony/Component/DependencyInjection/Exception/AutowiringFailedException.php +++ b/src/Symfony/Component/DependencyInjection/Exception/AutowiringFailedException.php -@@ -71,5 +71,5 @@ class AutowiringFailedException extends RuntimeException +@@ -69,5 +69,5 @@ class AutowiringFailedException extends RuntimeException * @return string */ - public function getServiceId() @@ -4295,8 +4285,8 @@ diff --git a/src/Symfony/Component/DependencyInjection/Loader/FileLoader.php b/s @@ -99,5 +99,5 @@ abstract class FileLoader extends BaseFileLoader * @return void */ -- public function registerClasses(Definition $prototype, string $namespace, string $resource, string|array $exclude = null/* , string $source = null */) -+ public function registerClasses(Definition $prototype, string $namespace, string $resource, string|array $exclude = null/* , string $source = null */): void +- public function registerClasses(Definition $prototype, string $namespace, string $resource, string|array|null $exclude = null/* , string $source = null */) ++ public function registerClasses(Definition $prototype, string $namespace, string $resource, string|array|null $exclude = null/* , string $source = null */): void { if (!str_ends_with($namespace, '\\')) { @@ -213,5 +213,5 @@ abstract class FileLoader extends BaseFileLoader @@ -4538,8 +4528,8 @@ diff --git a/src/Symfony/Component/DomCrawler/Crawler.php b/src/Symfony/Componen @@ -138,5 +138,5 @@ class Crawler implements \Countable, \IteratorAggregate * @return void */ -- public function addContent(string $content, string $type = null) -+ public function addContent(string $content, string $type = null): void +- public function addContent(string $content, ?string $type = null) ++ public function addContent(string $content, ?string $type = null): void { if (empty($type)) { @@ -180,5 +180,5 @@ class Crawler implements \Countable, \IteratorAggregate @@ -4713,21 +4703,21 @@ diff --git a/src/Symfony/Component/DomCrawler/Field/TextareaFormField.php b/src/ diff --git a/src/Symfony/Component/DomCrawler/Form.php b/src/Symfony/Component/DomCrawler/Form.php --- a/src/Symfony/Component/DomCrawler/Form.php +++ b/src/Symfony/Component/DomCrawler/Form.php -@@ -249,5 +249,5 @@ class Form extends Link implements \ArrayAccess +@@ -248,5 +248,5 @@ class Form extends Link implements \ArrayAccess * @return void */ - public function remove(string $name) + public function remove(string $name): void { $this->fields->remove($name); -@@ -271,5 +271,5 @@ class Form extends Link implements \ArrayAccess +@@ -270,5 +270,5 @@ class Form extends Link implements \ArrayAccess * @return void */ - public function set(FormField $field) + public function set(FormField $field): void { $this->fields->add($field); -@@ -358,5 +358,5 @@ class Form extends Link implements \ArrayAccess +@@ -357,5 +357,5 @@ class Form extends Link implements \ArrayAccess * @throws \LogicException If given node is not a button or input or does not have a form ancestor */ - protected function setNode(\DOMElement $node) @@ -5148,8 +5138,8 @@ diff --git a/src/Symfony/Component/ExpressionLanguage/TokenStream.php b/src/Symf @@ -61,5 +61,5 @@ class TokenStream * @return void */ -- public function expect(string $type, string $value = null, string $message = null) -+ public function expect(string $type, string $value = null, string $message = null): void +- public function expect(string $type, ?string $value = null, ?string $message = null) ++ public function expect(string $type, ?string $value = null, ?string $message = null): void { $token = $this->current; diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Component/Filesystem/Filesystem.php @@ -5162,84 +5152,84 @@ diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Compo + public function copy(string $originFile, string $targetFile, bool $overwriteNewerFiles = false): void { $originIsLocal = stream_is_local($originFile) || 0 === stripos($originFile, 'file://'); -@@ -89,5 +89,5 @@ class Filesystem +@@ -92,5 +92,5 @@ class Filesystem * @throws IOException On any directory creation failure */ - public function mkdir(string|iterable $dirs, int $mode = 0777) + public function mkdir(string|iterable $dirs, int $mode = 0777): void { foreach ($this->toIterable($dirs) as $dir) { -@@ -132,5 +132,5 @@ class Filesystem +@@ -135,5 +135,5 @@ class Filesystem * @throws IOException When touch fails */ -- public function touch(string|iterable $files, int $time = null, int $atime = null) -+ public function touch(string|iterable $files, int $time = null, int $atime = null): void +- public function touch(string|iterable $files, ?int $time = null, ?int $atime = null) ++ public function touch(string|iterable $files, ?int $time = null, ?int $atime = null): void { foreach ($this->toIterable($files) as $file) { -@@ -148,5 +148,5 @@ class Filesystem +@@ -151,5 +151,5 @@ class Filesystem * @throws IOException When removal fails */ - public function remove(string|iterable $files) + public function remove(string|iterable $files): void { if ($files instanceof \Traversable) { -@@ -216,5 +216,5 @@ class Filesystem +@@ -219,5 +219,5 @@ class Filesystem * @throws IOException When the change fails */ - public function chmod(string|iterable $files, int $mode, int $umask = 0000, bool $recursive = false) + public function chmod(string|iterable $files, int $mode, int $umask = 0000, bool $recursive = false): void { foreach ($this->toIterable($files) as $file) { -@@ -238,5 +238,5 @@ class Filesystem +@@ -245,5 +245,5 @@ class Filesystem * @throws IOException When the change fails */ - public function chown(string|iterable $files, string|int $user, bool $recursive = false) + public function chown(string|iterable $files, string|int $user, bool $recursive = false): void { foreach ($this->toIterable($files) as $file) { -@@ -266,5 +266,5 @@ class Filesystem +@@ -277,5 +277,5 @@ class Filesystem * @throws IOException When the change fails */ - public function chgrp(string|iterable $files, string|int $group, bool $recursive = false) + public function chgrp(string|iterable $files, string|int $group, bool $recursive = false): void { foreach ($this->toIterable($files) as $file) { -@@ -292,5 +292,5 @@ class Filesystem +@@ -303,5 +303,5 @@ class Filesystem * @throws IOException When origin cannot be renamed */ - public function rename(string $origin, string $target, bool $overwrite = false) + public function rename(string $origin, string $target, bool $overwrite = false): void { // we check that target does not exist -@@ -334,5 +334,5 @@ class Filesystem +@@ -345,5 +345,5 @@ class Filesystem * @throws IOException When symlink fails */ - public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = false) + public function symlink(string $originDir, string $targetDir, bool $copyOnWindows = false): void { self::assertFunctionExists('symlink'); -@@ -373,5 +373,5 @@ class Filesystem +@@ -384,5 +384,5 @@ class Filesystem * @throws IOException When link fails, including if link already exists */ - public function hardlink(string $originFile, string|iterable $targetFiles) + public function hardlink(string $originFile, string|iterable $targetFiles): void { self::assertFunctionExists('link'); -@@ -531,5 +531,5 @@ class Filesystem +@@ -542,5 +542,5 @@ class Filesystem * @throws IOException When file type is unknown */ -- public function mirror(string $originDir, string $targetDir, \Traversable $iterator = null, array $options = []) -+ public function mirror(string $originDir, string $targetDir, \Traversable $iterator = null, array $options = []): void +- public function mirror(string $originDir, string $targetDir, ?\Traversable $iterator = null, array $options = []) ++ public function mirror(string $originDir, string $targetDir, ?\Traversable $iterator = null, array $options = []): void { $targetDir = rtrim($targetDir, '/\\'); -@@ -657,5 +657,5 @@ class Filesystem +@@ -668,5 +668,5 @@ class Filesystem * @throws IOException if the file cannot be written to */ - public function dumpFile(string $filename, $content) + public function dumpFile(string $filename, $content): void { if (\is_array($content)) { -@@ -704,5 +704,5 @@ class Filesystem +@@ -719,5 +719,5 @@ class Filesystem * @throws IOException If the file is not writable */ - public function appendToFile(string $filename, $content/* , bool $lock = false */) @@ -5372,15 +5362,15 @@ diff --git a/src/Symfony/Component/Form/ButtonBuilder.php b/src/Symfony/Componen @@ -57,5 +57,5 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * @throws BadMethodCallException */ -- public function add(string|FormBuilderInterface $child, string $type = null, array $options = []): static -+ public function add(string|FormBuilderInterface $child, string $type = null, array $options = []): never +- public function add(string|FormBuilderInterface $child, ?string $type = null, array $options = []): static ++ public function add(string|FormBuilderInterface $child, ?string $type = null, array $options = []): never { throw new BadMethodCallException('Buttons cannot have children.'); @@ -69,5 +69,5 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * @throws BadMethodCallException */ -- public function create(string $name, string $type = null, array $options = []): FormBuilderInterface -+ public function create(string $name, string $type = null, array $options = []): never +- public function create(string $name, ?string $type = null, array $options = []): FormBuilderInterface ++ public function create(string $name, ?string $type = null, array $options = []): never { throw new BadMethodCallException('Buttons cannot have children.'); @@ -81,5 +81,5 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface @@ -5442,8 +5432,8 @@ diff --git a/src/Symfony/Component/Form/ButtonBuilder.php b/src/Symfony/Componen @@ -221,5 +221,5 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface * @throws BadMethodCallException */ -- public function setDataMapper(DataMapperInterface $dataMapper = null): static -+ public function setDataMapper(DataMapperInterface $dataMapper = null): never +- public function setDataMapper(?DataMapperInterface $dataMapper = null): static ++ public function setDataMapper(?DataMapperInterface $dataMapper = null): never { if (1 > \func_num_args()) { @@ -249,5 +249,5 @@ class ButtonBuilder implements \IteratorAggregate, FormBuilderInterface @@ -5824,28 +5814,28 @@ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php b/s diff --git a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php --- a/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/ChoiceType.php -@@ -66,5 +66,5 @@ class ChoiceType extends AbstractType +@@ -67,5 +67,5 @@ class ChoiceType extends AbstractType * @return void */ - public function buildForm(FormBuilderInterface $builder, array $options) + public function buildForm(FormBuilderInterface $builder, array $options): void { $unknownValues = []; -@@ -221,5 +221,5 @@ class ChoiceType extends AbstractType +@@ -223,5 +223,5 @@ class ChoiceType extends AbstractType * @return void */ - public function buildView(FormView $view, FormInterface $form, array $options) + public function buildView(FormView $view, FormInterface $form, array $options): void { $choiceTranslationDomain = $options['choice_translation_domain']; -@@ -278,5 +278,5 @@ class ChoiceType extends AbstractType +@@ -280,5 +280,5 @@ class ChoiceType extends AbstractType * @return void */ - public function finishView(FormView $view, FormInterface $form, array $options) + public function finishView(FormView $view, FormInterface $form, array $options): void { if ($options['expanded']) { -@@ -298,5 +298,5 @@ class ChoiceType extends AbstractType +@@ -300,5 +300,5 @@ class ChoiceType extends AbstractType * @return void */ - public function configureOptions(OptionsResolver $resolver) @@ -6005,28 +5995,28 @@ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/EmailType.php b/src/ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/FileType.php b/src/Symfony/Component/Form/Extension/Core/Type/FileType.php --- a/src/Symfony/Component/Form/Extension/Core/Type/FileType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/FileType.php -@@ -45,5 +45,5 @@ class FileType extends AbstractType +@@ -46,5 +46,5 @@ class FileType extends AbstractType * @return void */ - public function buildForm(FormBuilderInterface $builder, array $options) + public function buildForm(FormBuilderInterface $builder, array $options): void { // Ensure that submitted data is always an uploaded file or an array of some -@@ -89,5 +89,5 @@ class FileType extends AbstractType +@@ -91,5 +91,5 @@ class FileType extends AbstractType * @return void */ - public function buildView(FormView $view, FormInterface $form, array $options) + public function buildView(FormView $view, FormInterface $form, array $options): void { if ($options['multiple']) { -@@ -105,5 +105,5 @@ class FileType extends AbstractType +@@ -107,5 +107,5 @@ class FileType extends AbstractType * @return void */ - public function finishView(FormView $view, FormInterface $form, array $options) + public function finishView(FormView $view, FormInterface $form, array $options): void { $view->vars['multipart'] = true; -@@ -113,5 +113,5 @@ class FileType extends AbstractType +@@ -115,5 +115,5 @@ class FileType extends AbstractType * @return void */ - public function configureOptions(OptionsResolver $resolver) @@ -6318,21 +6308,21 @@ diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TextareaType.php b/s diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php --- a/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TimeType.php -@@ -38,5 +38,5 @@ class TimeType extends AbstractType +@@ -39,5 +39,5 @@ class TimeType extends AbstractType * @return void */ - public function buildForm(FormBuilderInterface $builder, array $options) + public function buildForm(FormBuilderInterface $builder, array $options): void { $parts = ['hour']; -@@ -229,5 +229,5 @@ class TimeType extends AbstractType +@@ -231,5 +231,5 @@ class TimeType extends AbstractType * @return void */ - public function buildView(FormView $view, FormInterface $form, array $options) + public function buildView(FormView $view, FormInterface $form, array $options): void { $view->vars = array_replace($view->vars, [ -@@ -260,5 +260,5 @@ class TimeType extends AbstractType +@@ -262,5 +262,5 @@ class TimeType extends AbstractType * @return void */ - public function configureOptions(OptionsResolver $resolver) @@ -7063,7 +7053,7 @@ diff --git a/src/Symfony/Component/HttpClient/DecoratorTrait.php b/src/Symfony/C diff --git a/src/Symfony/Component/HttpClient/HttpClientTrait.php b/src/Symfony/Component/HttpClient/HttpClientTrait.php --- a/src/Symfony/Component/HttpClient/HttpClientTrait.php +++ b/src/Symfony/Component/HttpClient/HttpClientTrait.php -@@ -679,5 +679,5 @@ trait HttpClientTrait +@@ -708,5 +708,5 @@ trait HttpClientTrait * @return string */ - private static function removeDotSegments(string $path) @@ -7103,7 +7093,7 @@ diff --git a/src/Symfony/Component/HttpClient/ScopingHttpClient.php b/src/Symfon diff --git a/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php b/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php --- a/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php +++ b/src/Symfony/Component/HttpFoundation/BinaryFileResponse.php -@@ -362,5 +362,5 @@ class BinaryFileResponse extends Response +@@ -366,5 +366,5 @@ class BinaryFileResponse extends Response * @return void */ - public static function trustXSendfileTypeHeader() @@ -7178,8 +7168,8 @@ diff --git a/src/Symfony/Component/HttpFoundation/HeaderBag.php b/src/Symfony/Co @@ -198,5 +198,5 @@ class HeaderBag implements \IteratorAggregate, \Countable, \Stringable * @throws \RuntimeException When the HTTP header is not parseable */ -- public function getDate(string $key, \DateTimeInterface $default = null): ?\DateTimeInterface -+ public function getDate(string $key, \DateTimeInterface $default = null): ?\DateTimeImmutable +- public function getDate(string $key, ?\DateTimeInterface $default = null): ?\DateTimeInterface ++ public function getDate(string $key, ?\DateTimeInterface $default = null): ?\DateTimeImmutable { if (null === $value = $this->get($key)) { @@ -216,5 +216,5 @@ class HeaderBag implements \IteratorAggregate, \Countable, \Stringable @@ -7237,98 +7227,98 @@ diff --git a/src/Symfony/Component/HttpFoundation/ParameterBag.php b/src/Symfony diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php --- a/src/Symfony/Component/HttpFoundation/Request.php +++ b/src/Symfony/Component/HttpFoundation/Request.php -@@ -274,5 +274,5 @@ class Request +@@ -275,5 +275,5 @@ class Request * @return void */ - public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null) + public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): void { $this->request = new InputBag($request); -@@ -434,5 +434,5 @@ class Request +@@ -446,5 +446,5 @@ class Request * @return void */ - public static function setFactory(?callable $callable) + public static function setFactory(?callable $callable): void { self::$requestFactory = $callable; -@@ -540,5 +540,5 @@ class Request +@@ -552,5 +552,5 @@ class Request * @return void */ - public function overrideGlobals() + public function overrideGlobals(): void { $this->server->set('QUERY_STRING', static::normalizeQueryString(http_build_query($this->query->all(), '', '&'))); -@@ -582,5 +582,5 @@ class Request +@@ -594,5 +594,5 @@ class Request * @return void */ - public static function setTrustedProxies(array $proxies, int $trustedHeaderSet) + public static function setTrustedProxies(array $proxies, int $trustedHeaderSet): void { self::$trustedProxies = array_reduce($proxies, function ($proxies, $proxy) { -@@ -625,5 +625,5 @@ class Request +@@ -637,5 +637,5 @@ class Request * @return void */ - public static function setTrustedHosts(array $hostPatterns) + public static function setTrustedHosts(array $hostPatterns): void { self::$trustedHostPatterns = array_map(fn ($hostPattern) => sprintf('{%s}i', $hostPattern), $hostPatterns); -@@ -673,5 +673,5 @@ class Request +@@ -685,5 +685,5 @@ class Request * @return void */ - public static function enableHttpMethodParameterOverride() + public static function enableHttpMethodParameterOverride(): void { self::$httpMethodParameterOverride = true; -@@ -760,5 +760,5 @@ class Request +@@ -772,5 +772,5 @@ class Request * @return void */ - public function setSession(SessionInterface $session) + public function setSession(SessionInterface $session): void { $this->session = $session; -@@ -1183,5 +1183,5 @@ class Request +@@ -1195,5 +1195,5 @@ class Request * @return void */ - public function setMethod(string $method) + public function setMethod(string $method): void { $this->method = null; -@@ -1306,5 +1306,5 @@ class Request +@@ -1318,5 +1318,5 @@ class Request * @return void */ - public function setFormat(?string $format, string|array $mimeTypes) + public function setFormat(?string $format, string|array $mimeTypes): void { if (null === static::$formats) { -@@ -1338,5 +1338,5 @@ class Request +@@ -1350,5 +1350,5 @@ class Request * @return void */ - public function setRequestFormat(?string $format) + public function setRequestFormat(?string $format): void { $this->format = $format; -@@ -1370,5 +1370,5 @@ class Request +@@ -1382,5 +1382,5 @@ class Request * @return void */ - public function setDefaultLocale(string $locale) + public function setDefaultLocale(string $locale): void { $this->defaultLocale = $locale; -@@ -1392,5 +1392,5 @@ class Request +@@ -1404,5 +1404,5 @@ class Request * @return void */ - public function setLocale(string $locale) + public function setLocale(string $locale): void { $this->setPhpDefaultLocale($this->locale = $locale); -@@ -1749,5 +1749,5 @@ class Request +@@ -1761,5 +1761,5 @@ class Request * @return string */ - protected function prepareRequestUri() + protected function prepareRequestUri(): string { $requestUri = ''; -@@ -1919,5 +1919,5 @@ class Request +@@ -1931,5 +1931,5 @@ class Request * @return void */ - protected static function initializeFormats() @@ -7445,18 +7435,18 @@ diff --git a/src/Symfony/Component/HttpFoundation/ResponseHeaderBag.php b/src/Sy @@ -184,5 +184,5 @@ class ResponseHeaderBag extends HeaderBag * @return void */ -- public function removeCookie(string $name, ?string $path = '/', string $domain = null) -+ public function removeCookie(string $name, ?string $path = '/', string $domain = null): void +- public function removeCookie(string $name, ?string $path = '/', ?string $domain = null) ++ public function removeCookie(string $name, ?string $path = '/', ?string $domain = null): void { $path ??= '/'; -@@ -237,5 +237,5 @@ class ResponseHeaderBag extends HeaderBag +@@ -239,5 +239,5 @@ class ResponseHeaderBag extends HeaderBag * @return void */ -- public function clearCookie(string $name, ?string $path = '/', string $domain = null, bool $secure = false, bool $httpOnly = true, string $sameSite = null) -+ public function clearCookie(string $name, ?string $path = '/', string $domain = null, bool $secure = false, bool $httpOnly = true, string $sameSite = null): void +- public function clearCookie(string $name, ?string $path = '/', ?string $domain = null, bool $secure = false, bool $httpOnly = true, ?string $sameSite = null /* , bool $partitioned = false */) ++ public function clearCookie(string $name, ?string $path = '/', ?string $domain = null, bool $secure = false, bool $httpOnly = true, ?string $sameSite = null /* , bool $partitioned = false */): void { - $this->setCookie(new Cookie($name, null, 1, $path, $domain, $secure, $httpOnly, false, $sameSite)); -@@ -247,5 +247,5 @@ class ResponseHeaderBag extends HeaderBag + $partitioned = 6 < \func_num_args() ? \func_get_arg(6) : false; +@@ -251,5 +251,5 @@ class ResponseHeaderBag extends HeaderBag * @return string */ - public function makeDisposition(string $disposition, string $filename, string $filenameFallback = '') @@ -7748,8 +7738,8 @@ diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/MetadataBag.ph @@ -89,5 +89,5 @@ class MetadataBag implements SessionBagInterface * @return void */ -- public function stampNew(int $lifetime = null) -+ public function stampNew(int $lifetime = null): void +- public function stampNew(?int $lifetime = null) ++ public function stampNew(?int $lifetime = null): void { $this->stampCreated($lifetime); @@ -135,5 +135,5 @@ class MetadataBag implements SessionBagInterface @@ -7807,8 +7797,8 @@ diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessi @@ -193,5 +193,5 @@ class MockArraySessionStorage implements SessionStorageInterface * @return void */ -- public function setMetadataBag(MetadataBag $bag = null) -+ public function setMetadataBag(MetadataBag $bag = null): void +- public function setMetadataBag(?MetadataBag $bag = null) ++ public function setMetadataBag(?MetadataBag $bag = null): void { if (1 > \func_num_args()) { @@ -223,5 +223,5 @@ class MockArraySessionStorage implements SessionStorageInterface @@ -7869,8 +7859,8 @@ diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionS @@ -318,5 +318,5 @@ class NativeSessionStorage implements SessionStorageInterface * @return void */ -- public function setMetadataBag(MetadataBag $metaBag = null) -+ public function setMetadataBag(MetadataBag $metaBag = null): void +- public function setMetadataBag(?MetadataBag $metaBag = null) ++ public function setMetadataBag(?MetadataBag $metaBag = null): void { if (1 > \func_num_args()) { @@ -351,5 +351,5 @@ class NativeSessionStorage implements SessionStorageInterface @@ -7883,15 +7873,15 @@ diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionS @@ -397,5 +397,5 @@ class NativeSessionStorage implements SessionStorageInterface * @throws \InvalidArgumentException */ -- public function setSaveHandler(AbstractProxy|\SessionHandlerInterface $saveHandler = null) -+ public function setSaveHandler(AbstractProxy|\SessionHandlerInterface $saveHandler = null): void +- public function setSaveHandler(AbstractProxy|\SessionHandlerInterface|null $saveHandler = null) ++ public function setSaveHandler(AbstractProxy|\SessionHandlerInterface|null $saveHandler = null): void { if (1 > \func_num_args()) { @@ -430,5 +430,5 @@ class NativeSessionStorage implements SessionStorageInterface * @return void */ -- protected function loadSession(array &$session = null) -+ protected function loadSession(array &$session = null): void +- protected function loadSession(?array &$session = null) ++ protected function loadSession(?array &$session = null): void { if (null === $session) { diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php b/src/Symfony/Component/HttpFoundation/Session/Storage/PhpBridgeSessionStorage.php @@ -8077,14 +8067,14 @@ diff --git a/src/Symfony/Component/HttpKernel/DataCollector/DataCollector.php b/ + protected function getCasters(): array { $casters = [ -@@ -86,5 +86,5 @@ abstract class DataCollector implements DataCollectorInterface +@@ -98,5 +98,5 @@ abstract class DataCollector implements DataCollectorInterface * @return void */ - public function __wakeup() + public function __wakeup(): void { } -@@ -107,5 +107,5 @@ abstract class DataCollector implements DataCollectorInterface +@@ -119,5 +119,5 @@ abstract class DataCollector implements DataCollectorInterface * @return void */ - public function reset() @@ -8097,8 +8087,8 @@ diff --git a/src/Symfony/Component/HttpKernel/DataCollector/DataCollectorInterfa @@ -28,5 +28,5 @@ interface DataCollectorInterface extends ResetInterface * @return void */ -- public function collect(Request $request, Response $response, \Throwable $exception = null); -+ public function collect(Request $request, Response $response, \Throwable $exception = null): void; +- public function collect(Request $request, Response $response, ?\Throwable $exception = null); ++ public function collect(Request $request, Response $response, ?\Throwable $exception = null): void; /** @@ -35,4 +35,4 @@ interface DataCollectorInterface extends ResetInterface @@ -8457,28 +8447,28 @@ diff --git a/src/Symfony/Component/HttpKernel/HttpCache/Esi.php b/src/Symfony/Co diff --git a/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php b/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php --- a/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php +++ b/src/Symfony/Component/HttpKernel/HttpCache/HttpCache.php -@@ -246,5 +246,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface +@@ -249,5 +249,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * @return void */ - public function terminate(Request $request, Response $response) + public function terminate(Request $request, Response $response): void { // Do not call any listeners in case of a cache hit. -@@ -466,5 +466,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface +@@ -469,5 +469,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * @return Response */ -- protected function forward(Request $request, bool $catch = false, Response $entry = null) -+ protected function forward(Request $request, bool $catch = false, Response $entry = null): Response +- protected function forward(Request $request, bool $catch = false, ?Response $entry = null) ++ protected function forward(Request $request, bool $catch = false, ?Response $entry = null): Response { $this->surrogate?->addSurrogateCapability($request); -@@ -600,5 +600,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface +@@ -603,5 +603,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * @throws \Exception */ - protected function store(Request $request, Response $response) + protected function store(Request $request, Response $response): void { try { -@@ -678,5 +678,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface +@@ -681,5 +681,5 @@ class HttpCache implements HttpKernelInterface, TerminableInterface * @return void */ - protected function processResponseBody(Request $request, Response $response) @@ -8495,7 +8485,7 @@ diff --git a/src/Symfony/Component/HttpKernel/HttpCache/ResponseCacheStrategy.ph + public function add(Response $response): void { ++$this->embeddedResponses; -@@ -102,5 +102,5 @@ class ResponseCacheStrategy implements ResponseCacheStrategyInterface +@@ -117,5 +117,5 @@ class ResponseCacheStrategy implements ResponseCacheStrategyInterface * @return void */ - public function update(Response $response) @@ -8678,21 +8668,21 @@ diff --git a/src/Symfony/Component/HttpKernel/Kernel.php b/src/Symfony/Component + protected function initializeContainer(): void { $class = $this->getContainerClass(); -@@ -618,5 +618,5 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl +@@ -626,5 +626,5 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl * @return void */ - protected function prepareContainer(ContainerBuilder $container) + protected function prepareContainer(ContainerBuilder $container): void { $extensions = []; -@@ -671,5 +671,5 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl +@@ -679,5 +679,5 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl * @return void */ - protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, string $class, string $baseClass) + protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, string $class, string $baseClass): void { // cache the container -@@ -847,5 +847,5 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl +@@ -857,5 +857,5 @@ abstract class Kernel implements KernelInterface, RebootableInterface, Terminabl * @return void */ - public function __wakeup() @@ -8729,15 +8719,15 @@ diff --git a/src/Symfony/Component/HttpKernel/Log/DebugLoggerInterface.php b/src @@ -34,5 +34,5 @@ interface DebugLoggerInterface * }> */ -- public function getLogs(Request $request = null); -+ public function getLogs(Request $request = null): array; +- public function getLogs(?Request $request = null); ++ public function getLogs(?Request $request = null): array; /** @@ -41,5 +41,5 @@ interface DebugLoggerInterface * @return int */ -- public function countErrors(Request $request = null); -+ public function countErrors(Request $request = null): int; +- public function countErrors(?Request $request = null); ++ public function countErrors(?Request $request = null): int; /** @@ -48,4 +48,4 @@ interface DebugLoggerInterface @@ -8759,8 +8749,8 @@ diff --git a/src/Symfony/Component/HttpKernel/Profiler/FileProfilerStorage.php b @@ -273,5 +273,5 @@ class FileProfilerStorage implements ProfilerStorageInterface * @return Profile */ -- protected function createProfileFromData(string $token, array $data, Profile $parent = null) -+ protected function createProfileFromData(string $token, array $data, Profile $parent = null): Profile +- protected function createProfileFromData(string $token, array $data, ?Profile $parent = null) ++ protected function createProfileFromData(string $token, array $data, ?Profile $parent = null): Profile { $profile = new Profile($token); diff --git a/src/Symfony/Component/HttpKernel/Profiler/Profile.php b/src/Symfony/Component/HttpKernel/Profiler/Profile.php @@ -8933,21 +8923,38 @@ diff --git a/src/Symfony/Component/Intl/Data/Bundle/Writer/BundleWriterInterface - public function write(string $path, string $locale, mixed $data); + public function write(string $path, string $locale, mixed $data): void; } +diff --git a/src/Symfony/Component/Intl/Transliterator/EmojiTransliterator.php b/src/Symfony/Component/Intl/Transliterator/EmojiTransliterator.php +--- a/src/Symfony/Component/Intl/Transliterator/EmojiTransliterator.php ++++ b/src/Symfony/Component/Intl/Transliterator/EmojiTransliterator.php +@@ -74,5 +74,5 @@ if (!class_exists(\Transliterator::class)) { + */ + #[\ReturnTypeWillChange] +- public function getErrorCode(): int|false ++ public function getErrorCode(): int + { + return isset($this->transliterator) ? $this->transliterator->getErrorCode() : 0; +@@ -83,5 +83,5 @@ if (!class_exists(\Transliterator::class)) { + */ + #[\ReturnTypeWillChange] +- public function getErrorMessage(): string|false ++ public function getErrorMessage(): string + { + return isset($this->transliterator) ? $this->transliterator->getErrorMessage() : ''; diff --git a/src/Symfony/Component/Intl/Util/IntlTestHelper.php b/src/Symfony/Component/Intl/Util/IntlTestHelper.php --- a/src/Symfony/Component/Intl/Util/IntlTestHelper.php +++ b/src/Symfony/Component/Intl/Util/IntlTestHelper.php @@ -33,5 +33,5 @@ class IntlTestHelper * @return void */ -- public static function requireIntl(TestCase $testCase, string $minimumIcuVersion = null) -+ public static function requireIntl(TestCase $testCase, string $minimumIcuVersion = null): void +- public static function requireIntl(TestCase $testCase, ?string $minimumIcuVersion = null) ++ public static function requireIntl(TestCase $testCase, ?string $minimumIcuVersion = null): void { $minimumIcuVersion ??= Intl::getIcuStubVersion(); @@ -67,5 +67,5 @@ class IntlTestHelper * @return void */ -- public static function requireFullIntl(TestCase $testCase, string $minimumIcuVersion = null) -+ public static function requireFullIntl(TestCase $testCase, string $minimumIcuVersion = null): void +- public static function requireFullIntl(TestCase $testCase, ?string $minimumIcuVersion = null) ++ public static function requireFullIntl(TestCase $testCase, ?string $minimumIcuVersion = null): void { // We only run tests if the intl extension is loaded... @@ -89,5 +89,5 @@ class IntlTestHelper @@ -8978,10 +8985,10 @@ diff --git a/src/Symfony/Component/Ldap/Adapter/ConnectionInterface.php b/src/Sy --- a/src/Symfony/Component/Ldap/Adapter/ConnectionInterface.php +++ b/src/Symfony/Component/Ldap/Adapter/ConnectionInterface.php @@ -35,4 +35,4 @@ interface ConnectionInterface - * @return void + * @throws InvalidCredentialsException When the connection can't be created because of an LDAP_INVALID_CREDENTIALS error */ -- public function bind(string $dn = null, #[\SensitiveParameter] string $password = null); -+ public function bind(string $dn = null, #[\SensitiveParameter] string $password = null): void; +- public function bind(?string $dn = null, #[\SensitiveParameter] ?string $password = null); ++ public function bind(?string $dn = null, #[\SensitiveParameter] ?string $password = null): void; } diff --git a/src/Symfony/Component/Ldap/Adapter/EntryManagerInterface.php b/src/Symfony/Component/Ldap/Adapter/EntryManagerInterface.php --- a/src/Symfony/Component/Ldap/Adapter/EntryManagerInterface.php @@ -9033,8 +9040,8 @@ diff --git a/src/Symfony/Component/Ldap/Adapter/ExtLdap/Connection.php b/src/Sym @@ -68,5 +68,5 @@ class Connection extends AbstractConnection * @return void */ -- public function bind(string $dn = null, #[\SensitiveParameter] string $password = null) -+ public function bind(string $dn = null, #[\SensitiveParameter] string $password = null): void +- public function bind(?string $dn = null, #[\SensitiveParameter] ?string $password = null) ++ public function bind(?string $dn = null, #[\SensitiveParameter] ?string $password = null): void { if (!$this->connection) { @@ -101,5 +101,5 @@ class Connection extends AbstractConnection @@ -9148,10 +9155,10 @@ diff --git a/src/Symfony/Component/Ldap/LdapInterface.php b/src/Symfony/Componen --- a/src/Symfony/Component/Ldap/LdapInterface.php +++ b/src/Symfony/Component/Ldap/LdapInterface.php @@ -33,5 +33,5 @@ interface LdapInterface - * @return void + * @throws ConnectionException if dn / password could not be bound */ -- public function bind(string $dn = null, #[\SensitiveParameter] string $password = null); -+ public function bind(string $dn = null, #[\SensitiveParameter] string $password = null): void; +- public function bind(?string $dn = null, #[\SensitiveParameter] ?string $password = null); ++ public function bind(?string $dn = null, #[\SensitiveParameter] ?string $password = null): void; /** diff --git a/src/Symfony/Component/Ldap/Security/CheckLdapCredentialsListener.php b/src/Symfony/Component/Ldap/Security/CheckLdapCredentialsListener.php @@ -9205,8 +9212,8 @@ diff --git a/src/Symfony/Component/Lock/LockInterface.php b/src/Symfony/Componen @@ -42,5 +42,5 @@ interface LockInterface * @throws LockAcquiringException If the lock cannot be refreshed */ -- public function refresh(float $ttl = null); -+ public function refresh(float $ttl = null): void; +- public function refresh(?float $ttl = null); ++ public function refresh(?float $ttl = null): void; /** @@ -56,5 +56,5 @@ interface LockInterface @@ -9458,34 +9465,34 @@ diff --git a/src/Symfony/Component/Lock/Store/MemcachedStore.php b/src/Symfony/C diff --git a/src/Symfony/Component/Lock/Store/MongoDbStore.php b/src/Symfony/Component/Lock/Store/MongoDbStore.php --- a/src/Symfony/Component/Lock/Store/MongoDbStore.php +++ b/src/Symfony/Component/Lock/Store/MongoDbStore.php -@@ -194,5 +194,5 @@ class MongoDbStore implements PersistingStoreInterface +@@ -209,5 +209,5 @@ class MongoDbStore implements PersistingStoreInterface * @throws DriverRuntimeException for other driver errors (e.g. connection errors) */ - public function createTtlIndex(int $expireAfterSeconds = 0) + public function createTtlIndex(int $expireAfterSeconds = 0): void { - $this->getCollection()->createIndex( -@@ -211,5 +211,5 @@ class MongoDbStore implements PersistingStoreInterface + $server = $this->getManager()->selectServer(); +@@ -231,5 +231,5 @@ class MongoDbStore implements PersistingStoreInterface * @throws LockExpiredException when save is called on an expired lock */ - public function save(Key $key) + public function save(Key $key): void { $key->reduceLifetime($this->initialTtl); -@@ -237,5 +237,5 @@ class MongoDbStore implements PersistingStoreInterface +@@ -257,5 +257,5 @@ class MongoDbStore implements PersistingStoreInterface * @throws LockExpiredException */ - public function putOffExpiration(Key $key, float $ttl) + public function putOffExpiration(Key $key, float $ttl): void { $key->reduceLifetime($ttl); -@@ -256,5 +256,5 @@ class MongoDbStore implements PersistingStoreInterface +@@ -276,5 +276,5 @@ class MongoDbStore implements PersistingStoreInterface * @return void */ - public function delete(Key $key) + public function delete(Key $key): void { - $this->getCollection()->deleteOne([ // filter + $write = new BulkWrite(); diff --git a/src/Symfony/Component/Lock/Store/PdoStore.php b/src/Symfony/Component/Lock/Store/PdoStore.php --- a/src/Symfony/Component/Lock/Store/PdoStore.php +++ b/src/Symfony/Component/Lock/Store/PdoStore.php @@ -9496,14 +9503,14 @@ diff --git a/src/Symfony/Component/Lock/Store/PdoStore.php b/src/Symfony/Compone + public function save(Key $key): void { $key->reduceLifetime($this->initialTtl); -@@ -119,5 +119,5 @@ class PdoStore implements PersistingStoreInterface +@@ -129,5 +129,5 @@ class PdoStore implements PersistingStoreInterface * @return void */ - public function putOffExpiration(Key $key, float $ttl) + public function putOffExpiration(Key $key, float $ttl): void { if ($ttl < 1) { -@@ -147,5 +147,5 @@ class PdoStore implements PersistingStoreInterface +@@ -157,5 +157,5 @@ class PdoStore implements PersistingStoreInterface * @return void */ - public function delete(Key $key) @@ -9771,7 +9778,7 @@ diff --git a/src/Symfony/Component/Messenger/EventListener/SendFailedMessageToFa diff --git a/src/Symfony/Component/Messenger/Exception/ValidationFailedException.php b/src/Symfony/Component/Messenger/Exception/ValidationFailedException.php --- a/src/Symfony/Component/Messenger/Exception/ValidationFailedException.php +++ b/src/Symfony/Component/Messenger/Exception/ValidationFailedException.php -@@ -33,5 +33,5 @@ class ValidationFailedException extends RuntimeException +@@ -37,5 +37,5 @@ class ValidationFailedException extends RuntimeException implements EnvelopeAwar * @return object */ - public function getViolatingMessage() @@ -9831,7 +9838,7 @@ diff --git a/src/Symfony/Component/Mime/DependencyInjection/AddMimeTypeGuesserPa diff --git a/src/Symfony/Component/Mime/Email.php b/src/Symfony/Component/Mime/Email.php --- a/src/Symfony/Component/Mime/Email.php +++ b/src/Symfony/Component/Mime/Email.php -@@ -400,5 +400,5 @@ class Email extends Message +@@ -404,5 +404,5 @@ class Email extends Message * @return void */ - public function ensureValidity() @@ -9919,7 +9926,7 @@ diff --git a/src/Symfony/Component/Mime/Message.php b/src/Symfony/Component/Mime - public function ensureValidity() + public function ensureValidity(): void { - if (!$this->headers->has('To') && !$this->headers->has('Cc') && !$this->headers->has('Bcc')) { + if (!$this->headers->get('To')?->getBody() && !$this->headers->get('Cc')?->getBody() && !$this->headers->get('Bcc')?->getBody()) { diff --git a/src/Symfony/Component/Mime/Part/DataPart.php b/src/Symfony/Component/Mime/Part/DataPart.php --- a/src/Symfony/Component/Mime/Part/DataPart.php +++ b/src/Symfony/Component/Mime/Part/DataPart.php @@ -9933,7 +9940,7 @@ diff --git a/src/Symfony/Component/Mime/Part/DataPart.php b/src/Symfony/Componen diff --git a/src/Symfony/Component/Mime/Part/TextPart.php b/src/Symfony/Component/Mime/Part/TextPart.php --- a/src/Symfony/Component/Mime/Part/TextPart.php +++ b/src/Symfony/Component/Mime/Part/TextPart.php -@@ -236,5 +236,5 @@ class TextPart extends AbstractPart +@@ -240,5 +240,5 @@ class TextPart extends AbstractPart * @return void */ - public function __wakeup() @@ -9943,7 +9950,7 @@ diff --git a/src/Symfony/Component/Mime/Part/TextPart.php b/src/Symfony/Componen diff --git a/src/Symfony/Component/Mime/RawMessage.php b/src/Symfony/Component/Mime/RawMessage.php --- a/src/Symfony/Component/Mime/RawMessage.php +++ b/src/Symfony/Component/Mime/RawMessage.php -@@ -76,5 +76,5 @@ class RawMessage +@@ -100,5 +100,5 @@ class RawMessage * @throws LogicException if the message is not valid */ - public function ensureValidity() @@ -10045,14 +10052,14 @@ diff --git a/src/Symfony/Component/Process/Exception/ProcessTimedOutException.ph diff --git a/src/Symfony/Component/Process/ExecutableFinder.php b/src/Symfony/Component/Process/ExecutableFinder.php --- a/src/Symfony/Component/Process/ExecutableFinder.php +++ b/src/Symfony/Component/Process/ExecutableFinder.php -@@ -27,5 +27,5 @@ class ExecutableFinder +@@ -35,5 +35,5 @@ class ExecutableFinder * @return void */ - public function setSuffixes(array $suffixes) + public function setSuffixes(array $suffixes): void { $this->suffixes = $suffixes; -@@ -37,5 +37,5 @@ class ExecutableFinder +@@ -45,5 +45,5 @@ class ExecutableFinder * @return void */ - public function addSuffix(string $suffix) @@ -10065,8 +10072,8 @@ diff --git a/src/Symfony/Component/Process/InputStream.php b/src/Symfony/Compone @@ -32,5 +32,5 @@ class InputStream implements \IteratorAggregate * @return void */ -- public function onEmpty(callable $onEmpty = null) -+ public function onEmpty(callable $onEmpty = null): void +- public function onEmpty(?callable $onEmpty = null) ++ public function onEmpty(?callable $onEmpty = null): void { $this->onEmpty = null !== $onEmpty ? $onEmpty(...) : null; @@ -45,5 +45,5 @@ class InputStream implements \IteratorAggregate @@ -10096,42 +10103,42 @@ diff --git a/src/Symfony/Component/Process/PhpProcess.php b/src/Symfony/Componen @@ -59,5 +59,5 @@ class PhpProcess extends Process * @return void */ -- public function start(callable $callback = null, array $env = []) -+ public function start(callable $callback = null, array $env = []): void +- public function start(?callable $callback = null, array $env = []) ++ public function start(?callable $callback = null, array $env = []): void { if (null === $this->getCommandLine()) { diff --git a/src/Symfony/Component/Process/Process.php b/src/Symfony/Component/Process/Process.php --- a/src/Symfony/Component/Process/Process.php +++ b/src/Symfony/Component/Process/Process.php -@@ -205,5 +205,5 @@ class Process implements \IteratorAggregate +@@ -204,5 +204,5 @@ class Process implements \IteratorAggregate * @return void */ - public function __wakeup() + public function __wakeup(): void { throw new \BadMethodCallException('Cannot unserialize '.__CLASS__); -@@ -296,5 +296,5 @@ class Process implements \IteratorAggregate +@@ -295,5 +295,5 @@ class Process implements \IteratorAggregate * @throws LogicException In case a callback is provided and output has been disabled */ -- public function start(callable $callback = null, array $env = []) -+ public function start(callable $callback = null, array $env = []): void +- public function start(?callable $callback = null, array $env = []) ++ public function start(?callable $callback = null, array $env = []): void { if ($this->isRunning()) { -@@ -1151,5 +1151,5 @@ class Process implements \IteratorAggregate +@@ -1146,5 +1146,5 @@ class Process implements \IteratorAggregate * @throws ProcessTimedOutException In case the timeout was reached */ - public function checkTimeout() + public function checkTimeout(): void { if (self::STATUS_STARTED !== $this->status) { -@@ -1192,5 +1192,5 @@ class Process implements \IteratorAggregate +@@ -1187,5 +1187,5 @@ class Process implements \IteratorAggregate * @return void */ - public function setOptions(array $options) + public function setOptions(array $options): void { if ($this->isRunning()) { -@@ -1289,5 +1289,5 @@ class Process implements \IteratorAggregate +@@ -1284,5 +1284,5 @@ class Process implements \IteratorAggregate * @return void */ - protected function updateStatus(bool $blocking) @@ -10147,7 +10154,7 @@ diff --git a/src/Symfony/Component/PropertyAccess/PropertyAccessor.php b/src/Sym - public function setValue(object|array &$objectOrArray, string|PropertyPathInterface $propertyPath, mixed $value) + public function setValue(object|array &$objectOrArray, string|PropertyPathInterface $propertyPath, mixed $value): void { - if (\is_object($objectOrArray) && false === strpbrk((string) $propertyPath, '.[')) { + if (\is_object($objectOrArray) && (false === strpbrk((string) $propertyPath, '.[') || $objectOrArray instanceof \stdClass && property_exists($objectOrArray, $propertyPath))) { diff --git a/src/Symfony/Component/PropertyAccess/PropertyAccessorInterface.php b/src/Symfony/Component/PropertyAccess/PropertyAccessorInterface.php --- a/src/Symfony/Component/PropertyAccess/PropertyAccessorInterface.php +++ b/src/Symfony/Component/PropertyAccess/PropertyAccessorInterface.php @@ -10199,15 +10206,15 @@ diff --git a/src/Symfony/Component/PropertyAccess/PropertyPathBuilder.php b/src/ @@ -135,5 +135,5 @@ class PropertyPathBuilder * @throws OutOfBoundsException If the offset is invalid */ -- public function replaceByIndex(int $offset, string $name = null) -+ public function replaceByIndex(int $offset, string $name = null): void +- public function replaceByIndex(int $offset, ?string $name = null) ++ public function replaceByIndex(int $offset, ?string $name = null): void { if (!isset($this->elements[$offset])) { @@ -155,5 +155,5 @@ class PropertyPathBuilder * @throws OutOfBoundsException If the offset is invalid */ -- public function replaceByProperty(int $offset, string $name = null) -+ public function replaceByProperty(int $offset, string $name = null): void +- public function replaceByProperty(int $offset, ?string $name = null) ++ public function replaceByProperty(int $offset, ?string $name = null): void { if (!isset($this->elements[$offset])) { diff --git a/src/Symfony/Component/PropertyAccess/PropertyPathInterface.php b/src/Symfony/Component/PropertyAccess/PropertyPathInterface.php @@ -10481,35 +10488,35 @@ diff --git a/src/Symfony/Component/Routing/Loader/AttributeClassLoader.php b/src + public function setRouteAnnotationClass(string $class): void { $this->routeAnnotationClass = $class; -@@ -175,5 +175,5 @@ abstract class AttributeClassLoader implements LoaderInterface +@@ -183,5 +183,5 @@ abstract class AttributeClassLoader implements LoaderInterface * @return void */ - protected function addRoute(RouteCollection $collection, object $annot, array $globals, \ReflectionClass $class, \ReflectionMethod $method) + protected function addRoute(RouteCollection $collection, object $annot, array $globals, \ReflectionClass $class, \ReflectionMethod $method): void { if ($annot->getEnv() && $annot->getEnv() !== $this->env) { -@@ -282,5 +282,5 @@ abstract class AttributeClassLoader implements LoaderInterface +@@ -290,5 +290,5 @@ abstract class AttributeClassLoader implements LoaderInterface * @return string */ - protected function getDefaultRouteName(\ReflectionClass $class, \ReflectionMethod $method) + protected function getDefaultRouteName(\ReflectionClass $class, \ReflectionMethod $method): string { $name = str_replace('\\', '_', $class->name).'_'.$method->name; -@@ -297,5 +297,5 @@ abstract class AttributeClassLoader implements LoaderInterface +@@ -305,5 +305,5 @@ abstract class AttributeClassLoader implements LoaderInterface * @return array */ - protected function getGlobals(\ReflectionClass $class) + protected function getGlobals(\ReflectionClass $class): array { $globals = $this->resetGlobals(); -@@ -382,5 +382,5 @@ abstract class AttributeClassLoader implements LoaderInterface +@@ -390,5 +390,5 @@ abstract class AttributeClassLoader implements LoaderInterface * @return Route */ - protected function createRoute(string $path, array $defaults, array $requirements, array $options, ?string $host, array $schemes, array $methods, ?string $condition) + protected function createRoute(string $path, array $defaults, array $requirements, array $options, ?string $host, array $schemes, array $methods, ?string $condition): Route { return new Route($path, $defaults, $requirements, $options, $host, $schemes, $methods, $condition); -@@ -390,5 +390,5 @@ abstract class AttributeClassLoader implements LoaderInterface +@@ -398,5 +398,5 @@ abstract class AttributeClassLoader implements LoaderInterface * @return void */ - abstract protected function configureRoute(Route $route, \ReflectionClass $class, \ReflectionMethod $method, object $annot); @@ -10661,78 +10668,78 @@ diff --git a/src/Symfony/Component/Routing/RouteCollection.php b/src/Symfony/Com - public function remove(string|array $name) + public function remove(string|array $name): void { - foreach ((array) $name as $n) { -@@ -159,5 +159,5 @@ class RouteCollection implements \IteratorAggregate, \Countable + $routes = []; +@@ -174,5 +174,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function addCollection(self $collection) + public function addCollection(self $collection): void { // we need to remove all routes with the same names first because just replacing them -@@ -188,5 +188,5 @@ class RouteCollection implements \IteratorAggregate, \Countable +@@ -203,5 +203,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function addPrefix(string $prefix, array $defaults = [], array $requirements = []) + public function addPrefix(string $prefix, array $defaults = [], array $requirements = []): void { $prefix = trim(trim($prefix), '/'); -@@ -208,5 +208,5 @@ class RouteCollection implements \IteratorAggregate, \Countable +@@ -223,5 +223,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function addNamePrefix(string $prefix) + public function addNamePrefix(string $prefix): void { $prefixedRoutes = []; -@@ -238,5 +238,5 @@ class RouteCollection implements \IteratorAggregate, \Countable +@@ -253,5 +253,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function setHost(?string $pattern, array $defaults = [], array $requirements = []) + public function setHost(?string $pattern, array $defaults = [], array $requirements = []): void { foreach ($this->routes as $route) { -@@ -254,5 +254,5 @@ class RouteCollection implements \IteratorAggregate, \Countable +@@ -269,5 +269,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function setCondition(?string $condition) + public function setCondition(?string $condition): void { foreach ($this->routes as $route) { -@@ -268,5 +268,5 @@ class RouteCollection implements \IteratorAggregate, \Countable +@@ -283,5 +283,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function addDefaults(array $defaults) + public function addDefaults(array $defaults): void { if ($defaults) { -@@ -284,5 +284,5 @@ class RouteCollection implements \IteratorAggregate, \Countable +@@ -299,5 +299,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function addRequirements(array $requirements) + public function addRequirements(array $requirements): void { if ($requirements) { -@@ -300,5 +300,5 @@ class RouteCollection implements \IteratorAggregate, \Countable +@@ -315,5 +315,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function addOptions(array $options) + public function addOptions(array $options): void { if ($options) { -@@ -316,5 +316,5 @@ class RouteCollection implements \IteratorAggregate, \Countable +@@ -331,5 +331,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function setSchemes(string|array $schemes) + public function setSchemes(string|array $schemes): void { foreach ($this->routes as $route) { -@@ -330,5 +330,5 @@ class RouteCollection implements \IteratorAggregate, \Countable +@@ -345,5 +345,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function setMethods(string|array $methods) + public function setMethods(string|array $methods): void { foreach ($this->routes as $route) { -@@ -353,5 +353,5 @@ class RouteCollection implements \IteratorAggregate, \Countable +@@ -368,5 +368,5 @@ class RouteCollection implements \IteratorAggregate, \Countable * @return void */ - public function addResource(ResourceInterface $resource) @@ -10777,7 +10784,7 @@ diff --git a/src/Symfony/Component/Routing/Router.php b/src/Symfony/Component/Ro + public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory): void { $this->configCacheFactory = $configCacheFactory; -@@ -318,5 +318,5 @@ class Router implements RouterInterface, RequestMatcherInterface +@@ -320,5 +320,5 @@ class Router implements RouterInterface, RequestMatcherInterface * @return void */ - public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider) @@ -10915,8 +10922,8 @@ diff --git a/src/Symfony/Component/Security/Core/Authentication/Token/Storage/To @@ -41,5 +41,5 @@ class TokenStorage implements TokenStorageInterface, ResetInterface * @return void */ -- public function setToken(TokenInterface $token = null) -+ public function setToken(TokenInterface $token = null): void +- public function setToken(?TokenInterface $token = null) ++ public function setToken(?TokenInterface $token = null): void { if (1 > \func_num_args()) { @@ -64,5 +64,5 @@ class TokenStorage implements TokenStorageInterface, ResetInterface @@ -11225,8 +11232,8 @@ diff --git a/src/Symfony/Component/Security/Http/AccessMap.php b/src/Symfony/Com @@ -31,5 +31,5 @@ class AccessMap implements AccessMapInterface * @return void */ -- public function add(RequestMatcherInterface $requestMatcher, array $attributes = [], string $channel = null) -+ public function add(RequestMatcherInterface $requestMatcher, array $attributes = [], string $channel = null): void +- public function add(RequestMatcherInterface $requestMatcher, array $attributes = [], ?string $channel = null) ++ public function add(RequestMatcherInterface $requestMatcher, array $attributes = [], ?string $channel = null): void { $this->map[] = [$requestMatcher, $attributes, $channel]; diff --git a/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php b/src/Symfony/Component/Security/Http/Authentication/DefaultAuthenticationFailureHandler.php @@ -11265,8 +11272,8 @@ diff --git a/src/Symfony/Component/Security/Http/EntryPoint/AuthenticationEntryP @@ -43,4 +43,4 @@ interface AuthenticationEntryPointInterface * @return Response */ -- public function start(Request $request, AuthenticationException $authException = null); -+ public function start(Request $request, AuthenticationException $authException = null): Response; +- public function start(Request $request, ?AuthenticationException $authException = null); ++ public function start(Request $request, ?AuthenticationException $authException = null): Response; } diff --git a/src/Symfony/Component/Security/Http/Event/LoginFailureEvent.php b/src/Symfony/Component/Security/Http/Event/LoginFailureEvent.php --- a/src/Symfony/Component/Security/Http/Event/LoginFailureEvent.php @@ -11335,8 +11342,8 @@ diff --git a/src/Symfony/Component/Security/Http/FirewallMap.php b/src/Symfony/C @@ -35,5 +35,5 @@ class FirewallMap implements FirewallMapInterface * @return void */ -- public function add(RequestMatcherInterface $requestMatcher = null, array $listeners = [], ExceptionListener $exceptionListener = null, LogoutListener $logoutListener = null) -+ public function add(RequestMatcherInterface $requestMatcher = null, array $listeners = [], ExceptionListener $exceptionListener = null, LogoutListener $logoutListener = null): void +- public function add(?RequestMatcherInterface $requestMatcher = null, array $listeners = [], ?ExceptionListener $exceptionListener = null, ?LogoutListener $logoutListener = null) ++ public function add(?RequestMatcherInterface $requestMatcher = null, array $listeners = [], ?ExceptionListener $exceptionListener = null, ?LogoutListener $logoutListener = null): void { $this->map[] = [$requestMatcher, $listeners, $exceptionListener, $logoutListener]; diff --git a/src/Symfony/Component/Security/Http/FirewallMapInterface.php b/src/Symfony/Component/Security/Http/FirewallMapInterface.php @@ -11354,15 +11361,15 @@ diff --git a/src/Symfony/Component/Security/Http/Logout/LogoutUrlGenerator.php b @@ -50,5 +50,5 @@ class LogoutUrlGenerator * @return void */ -- public function registerListener(string $key, string $logoutPath, ?string $csrfTokenId, ?string $csrfParameter, CsrfTokenManagerInterface $csrfTokenManager = null, string $context = null) -+ public function registerListener(string $key, string $logoutPath, ?string $csrfTokenId, ?string $csrfParameter, CsrfTokenManagerInterface $csrfTokenManager = null, string $context = null): void +- public function registerListener(string $key, string $logoutPath, ?string $csrfTokenId, ?string $csrfParameter, ?CsrfTokenManagerInterface $csrfTokenManager = null, ?string $context = null) ++ public function registerListener(string $key, string $logoutPath, ?string $csrfTokenId, ?string $csrfParameter, ?CsrfTokenManagerInterface $csrfTokenManager = null, ?string $context = null): void { $this->listeners[$key] = [$logoutPath, $csrfTokenId, $csrfParameter, $csrfTokenManager, $context]; @@ -74,5 +74,5 @@ class LogoutUrlGenerator * @return void */ -- public function setCurrentFirewall(?string $key, string $context = null) -+ public function setCurrentFirewall(?string $key, string $context = null): void +- public function setCurrentFirewall(?string $key, ?string $context = null) ++ public function setCurrentFirewall(?string $key, ?string $context = null): void { $this->currentFirewallName = $key; diff --git a/src/Symfony/Component/Security/Http/RememberMe/AbstractRememberMeHandler.php b/src/Symfony/Component/Security/Http/RememberMe/AbstractRememberMeHandler.php @@ -11423,8 +11430,8 @@ diff --git a/src/Symfony/Component/Semaphore/SemaphoreInterface.php b/src/Symfon @@ -38,5 +38,5 @@ interface SemaphoreInterface * @throws SemaphoreExpiredException If the semaphore has expired */ -- public function refresh(float $ttlInSecond = null); -+ public function refresh(float $ttlInSecond = null): void; +- public function refresh(?float $ttlInSecond = null); ++ public function refresh(?float $ttlInSecond = null): void; /** @@ -52,5 +52,5 @@ interface SemaphoreInterface @@ -11517,15 +11524,15 @@ diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php @@ -271,5 +271,5 @@ abstract class AbstractNormalizer implements NormalizerInterface, DenormalizerIn * @return bool */ -- protected function isAllowedAttribute(object|string $classOrObject, string $attribute, string $format = null, array $context = []) -+ protected function isAllowedAttribute(object|string $classOrObject, string $attribute, string $format = null, array $context = []): bool +- protected function isAllowedAttribute(object|string $classOrObject, string $attribute, ?string $format = null, array $context = []) ++ protected function isAllowedAttribute(object|string $classOrObject, string $attribute, ?string $format = null, array $context = []): bool { $ignoredAttributes = $context[self::IGNORED_ATTRIBUTES] ?? $this->defaultContext[self::IGNORED_ATTRIBUTES]; @@ -322,5 +322,5 @@ abstract class AbstractNormalizer implements NormalizerInterface, DenormalizerIn * @throws MissingConstructorArgumentsException */ -- protected function instantiateObject(array &$data, string $class, array &$context, \ReflectionClass $reflectionClass, array|bool $allowedAttributes, string $format = null) -+ protected function instantiateObject(array &$data, string $class, array &$context, \ReflectionClass $reflectionClass, array|bool $allowedAttributes, string $format = null): object +- protected function instantiateObject(array &$data, string $class, array &$context, \ReflectionClass $reflectionClass, array|bool $allowedAttributes, ?string $format = null) ++ protected function instantiateObject(array &$data, string $class, array &$context, \ReflectionClass $reflectionClass, array|bool $allowedAttributes, ?string $format = null): object { if (null !== $object = $this->extractObjectToPopulate($class, $context, self::OBJECT_TO_POPULATE)) { diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -11534,57 +11541,57 @@ diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalize @@ -144,5 +144,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return bool */ -- public function supportsNormalization(mixed $data, string $format = null /* , array $context = [] */) -+ public function supportsNormalization(mixed $data, string $format = null /* , array $context = [] */): bool +- public function supportsNormalization(mixed $data, ?string $format = null /* , array $context = [] */) ++ public function supportsNormalization(mixed $data, ?string $format = null /* , array $context = [] */): bool { return \is_object($data) && !$data instanceof \Traversable; @@ -152,5 +152,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return array|string|int|float|bool|\ArrayObject|null */ -- public function normalize(mixed $object, string $format = null, array $context = []) -+ public function normalize(mixed $object, string $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null +- public function normalize(mixed $object, ?string $format = null, array $context = []) ++ public function normalize(mixed $object, ?string $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null { - if (!isset($context['cache_key'])) { -@@ -236,5 +236,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer + $context['_read_attributes'] = true; +@@ -235,5 +235,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return object */ -- protected function instantiateObject(array &$data, string $class, array &$context, \ReflectionClass $reflectionClass, array|bool $allowedAttributes, string $format = null) -+ protected function instantiateObject(array &$data, string $class, array &$context, \ReflectionClass $reflectionClass, array|bool $allowedAttributes, string $format = null): object +- protected function instantiateObject(array &$data, string $class, array &$context, \ReflectionClass $reflectionClass, array|bool $allowedAttributes, ?string $format = null) ++ protected function instantiateObject(array &$data, string $class, array &$context, \ReflectionClass $reflectionClass, array|bool $allowedAttributes, ?string $format = null): object { if ($class !== $mappedClass = $this->getMappedClass($data, $class, $context)) { -@@ -287,5 +287,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -286,5 +286,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return string[] */ -- abstract protected function extractAttributes(object $object, string $format = null, array $context = []); -+ abstract protected function extractAttributes(object $object, string $format = null, array $context = []): array; +- abstract protected function extractAttributes(object $object, ?string $format = null, array $context = []); ++ abstract protected function extractAttributes(object $object, ?string $format = null, array $context = []): array; /** -@@ -294,5 +294,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -293,5 +293,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return mixed */ -- abstract protected function getAttributeValue(object $object, string $attribute, string $format = null, array $context = []); -+ abstract protected function getAttributeValue(object $object, string $attribute, string $format = null, array $context = []): mixed; +- abstract protected function getAttributeValue(object $object, string $attribute, ?string $format = null, array $context = []); ++ abstract protected function getAttributeValue(object $object, string $attribute, ?string $format = null, array $context = []): mixed; /** -@@ -301,5 +301,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -300,5 +300,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return bool */ -- public function supportsDenormalization(mixed $data, string $type, string $format = null /* , array $context = [] */) -+ public function supportsDenormalization(mixed $data, string $type, string $format = null /* , array $context = [] */): bool +- public function supportsDenormalization(mixed $data, string $type, ?string $format = null /* , array $context = [] */) ++ public function supportsDenormalization(mixed $data, string $type, ?string $format = null /* , array $context = [] */): bool { return class_exists($type) || (interface_exists($type, false) && null !== $this->classDiscriminatorResolver?->getMappingForClass($type)); -@@ -309,5 +309,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer +@@ -308,5 +308,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return mixed */ -- public function denormalize(mixed $data, string $type, string $format = null, array $context = []) -+ public function denormalize(mixed $data, string $type, string $format = null, array $context = []): mixed +- public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []) ++ public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []): mixed { - if (!isset($context['cache_key'])) { -@@ -417,5 +417,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer + $context['_read_attributes'] = false; +@@ -430,5 +430,5 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @return void */ -- abstract protected function setAttributeValue(object $object, string $attribute, mixed $value, string $format = null, array $context = []); -+ abstract protected function setAttributeValue(object $object, string $attribute, mixed $value, string $format = null, array $context = []): void; +- abstract protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []); ++ abstract protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []): void; /** diff --git a/src/Symfony/Component/Serializer/Normalizer/DenormalizableInterface.php b/src/Symfony/Component/Serializer/Normalizer/DenormalizableInterface.php @@ -11593,8 +11600,8 @@ diff --git a/src/Symfony/Component/Serializer/Normalizer/DenormalizableInterface @@ -37,4 +37,4 @@ interface DenormalizableInterface * @return void */ -- public function denormalize(DenormalizerInterface $denormalizer, array|string|int|float|bool $data, string $format = null, array $context = []); -+ public function denormalize(DenormalizerInterface $denormalizer, array|string|int|float|bool $data, string $format = null, array $context = []): void; +- public function denormalize(DenormalizerInterface $denormalizer, array|string|int|float|bool $data, ?string $format = null, array $context = []); ++ public function denormalize(DenormalizerInterface $denormalizer, array|string|int|float|bool $data, ?string $format = null, array $context = []): void; } diff --git a/src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareInterface.php b/src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareInterface.php --- a/src/Symfony/Component/Serializer/Normalizer/DenormalizerAwareInterface.php @@ -11611,27 +11618,34 @@ diff --git a/src/Symfony/Component/Serializer/Normalizer/DenormalizerInterface.p @@ -47,5 +47,5 @@ interface DenormalizerInterface * @throws ExceptionInterface Occurs for all the other cases of errors */ -- public function denormalize(mixed $data, string $type, string $format = null, array $context = []); -+ public function denormalize(mixed $data, string $type, string $format = null, array $context = []): mixed; +- public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []); ++ public function denormalize(mixed $data, string $type, ?string $format = null, array $context = []): mixed; /** @@ -59,5 +59,5 @@ interface DenormalizerInterface * @return bool */ -- public function supportsDenormalization(mixed $data, string $type, string $format = null /* , array $context = [] */); -+ public function supportsDenormalization(mixed $data, string $type, string $format = null /* , array $context = [] */): bool; +- public function supportsDenormalization(mixed $data, string $type, ?string $format = null /* , array $context = [] */); ++ public function supportsDenormalization(mixed $data, string $type, ?string $format = null /* , array $context = [] */): bool; /** diff --git a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php --- a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php -@@ -147,5 +147,5 @@ class GetSetMethodNormalizer extends AbstractObjectNormalizer +@@ -168,5 +168,5 @@ class GetSetMethodNormalizer extends AbstractObjectNormalizer * @return void */ -- protected function setAttributeValue(object $object, string $attribute, mixed $value, string $format = null, array $context = []) -+ protected function setAttributeValue(object $object, string $attribute, mixed $value, string $format = null, array $context = []): void +- protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []) ++ protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []): void + { + $setter = 'set'.$attribute; +@@ -182,5 +182,5 @@ class GetSetMethodNormalizer extends AbstractObjectNormalizer + } + +- protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []) ++ protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []): bool { - $setter = 'set'.ucfirst($attribute); + if (!parent::isAllowedAttribute($classOrObject, $attribute, $format, $context)) { diff --git a/src/Symfony/Component/Serializer/Normalizer/NormalizerAwareInterface.php b/src/Symfony/Component/Serializer/Normalizer/NormalizerAwareInterface.php --- a/src/Symfony/Component/Serializer/Normalizer/NormalizerAwareInterface.php +++ b/src/Symfony/Component/Serializer/Normalizer/NormalizerAwareInterface.php @@ -11657,35 +11671,42 @@ diff --git a/src/Symfony/Component/Serializer/Normalizer/NormalizerInterface.php @@ -39,5 +39,5 @@ interface NormalizerInterface * @throws ExceptionInterface Occurs for all the other cases of errors */ -- public function normalize(mixed $object, string $format = null, array $context = []); -+ public function normalize(mixed $object, string $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null; +- public function normalize(mixed $object, ?string $format = null, array $context = []); ++ public function normalize(mixed $object, ?string $format = null, array $context = []): array|string|int|float|bool|\ArrayObject|null; /** @@ -50,5 +50,5 @@ interface NormalizerInterface * @return bool */ -- public function supportsNormalization(mixed $data, string $format = null /* , array $context = [] */); -+ public function supportsNormalization(mixed $data, string $format = null /* , array $context = [] */): bool; +- public function supportsNormalization(mixed $data, ?string $format = null /* , array $context = [] */); ++ public function supportsNormalization(mixed $data, ?string $format = null /* , array $context = [] */): bool; /** diff --git a/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php --- a/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php -@@ -146,5 +146,5 @@ class ObjectNormalizer extends AbstractObjectNormalizer +@@ -156,5 +156,5 @@ class ObjectNormalizer extends AbstractObjectNormalizer * @return void */ -- protected function setAttributeValue(object $object, string $attribute, mixed $value, string $format = null, array $context = []) -+ protected function setAttributeValue(object $object, string $attribute, mixed $value, string $format = null, array $context = []): void +- protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []) ++ protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []): void { try { +@@ -189,5 +189,5 @@ class ObjectNormalizer extends AbstractObjectNormalizer + } + +- protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []) ++ protected function isAllowedAttribute($classOrObject, string $attribute, ?string $format = null, array $context = []): bool + { + if (!parent::isAllowedAttribute($classOrObject, $attribute, $format, $context)) { diff --git a/src/Symfony/Component/Serializer/Normalizer/PropertyNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/PropertyNormalizer.php --- a/src/Symfony/Component/Serializer/Normalizer/PropertyNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/PropertyNormalizer.php -@@ -187,5 +187,5 @@ class PropertyNormalizer extends AbstractObjectNormalizer +@@ -191,5 +191,5 @@ class PropertyNormalizer extends AbstractObjectNormalizer * @return void */ -- protected function setAttributeValue(object $object, string $attribute, mixed $value, string $format = null, array $context = []) -+ protected function setAttributeValue(object $object, string $attribute, mixed $value, string $format = null, array $context = []): void +- protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []) ++ protected function setAttributeValue(object $object, string $attribute, mixed $value, ?string $format = null, array $context = []): void { try { diff --git a/src/Symfony/Component/Serializer/SerializerAwareInterface.php b/src/Symfony/Component/Serializer/SerializerAwareInterface.php @@ -11713,8 +11734,8 @@ diff --git a/src/Symfony/Component/Stopwatch/Stopwatch.php b/src/Symfony/Compone @@ -62,5 +62,5 @@ class Stopwatch implements ResetInterface * @throws \LogicException When the section to re-open is not reachable */ -- public function openSection(string $id = null) -+ public function openSection(string $id = null): void +- public function openSection(?string $id = null) ++ public function openSection(?string $id = null): void { $current = end($this->activeSections); @@ -86,5 +86,5 @@ class Stopwatch implements ResetInterface @@ -11869,8 +11890,8 @@ diff --git a/src/Symfony/Component/Templating/PhpEngine.php b/src/Symfony/Compon @@ -225,5 +225,5 @@ class PhpEngine implements EngineInterface, \ArrayAccess * @return void */ -- public function set(HelperInterface $helper, string $alias = null) -+ public function set(HelperInterface $helper, string $alias = null): void +- public function set(HelperInterface $helper, ?string $alias = null) ++ public function set(HelperInterface $helper, ?string $alias = null): void { $this->helpers[$helper->getName()] = $helper; @@ -262,5 +262,5 @@ class PhpEngine implements EngineInterface, \ArrayAccess @@ -12150,8 +12171,8 @@ diff --git a/src/Symfony/Component/Translation/Loader/CsvFileLoader.php b/src/Sy @@ -56,5 +56,5 @@ class CsvFileLoader extends FileLoader * @return void */ -- public function setCsvControl(string $delimiter = ';', string $enclosure = '"', string $escape = '\\') -+ public function setCsvControl(string $delimiter = ';', string $enclosure = '"', string $escape = '\\'): void +- public function setCsvControl(string $delimiter = ';', string $enclosure = '"', string $escape = '') ++ public function setCsvControl(string $delimiter = ';', string $enclosure = '"', string $escape = ''): void { $this->delimiter = $delimiter; diff --git a/src/Symfony/Component/Translation/LoggingTranslator.php b/src/Symfony/Component/Translation/LoggingTranslator.php @@ -12350,8 +12371,8 @@ diff --git a/src/Symfony/Component/Translation/Translator.php b/src/Symfony/Comp @@ -111,5 +111,5 @@ class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleA * @throws InvalidArgumentException If the locale contains invalid characters */ -- public function addResource(string $format, mixed $resource, string $locale, string $domain = null) -+ public function addResource(string $format, mixed $resource, string $locale, string $domain = null): void +- public function addResource(string $format, mixed $resource, string $locale, ?string $domain = null) ++ public function addResource(string $format, mixed $resource, string $locale, ?string $domain = null): void { $domain ??= 'messages'; @@ -130,5 +130,5 @@ class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleA @@ -12567,7 +12588,7 @@ diff --git a/src/Symfony/Component/Validator/ConstraintViolationListInterface.ph diff --git a/src/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php b/src/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php --- a/src/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php +++ b/src/Symfony/Component/Validator/Constraints/AbstractComparisonValidator.php -@@ -38,5 +38,5 @@ abstract class AbstractComparisonValidator extends ConstraintValidator +@@ -39,5 +39,5 @@ abstract class AbstractComparisonValidator extends ConstraintValidator * @return void */ - public function validate(mixed $value, Constraint $constraint) @@ -12597,7 +12618,7 @@ diff --git a/src/Symfony/Component/Validator/Constraints/AtLeastOneOfValidator.p diff --git a/src/Symfony/Component/Validator/Constraints/BicValidator.php b/src/Symfony/Component/Validator/Constraints/BicValidator.php --- a/src/Symfony/Component/Validator/Constraints/BicValidator.php +++ b/src/Symfony/Component/Validator/Constraints/BicValidator.php -@@ -67,5 +67,5 @@ class BicValidator extends ConstraintValidator +@@ -68,5 +68,5 @@ class BicValidator extends ConstraintValidator * @return void */ - public function validate(mixed $value, Constraint $constraint) @@ -12647,7 +12668,7 @@ diff --git a/src/Symfony/Component/Validator/Constraints/ChoiceValidator.php b/s diff --git a/src/Symfony/Component/Validator/Constraints/Collection.php b/src/Symfony/Component/Validator/Constraints/Collection.php --- a/src/Symfony/Component/Validator/Constraints/Collection.php +++ b/src/Symfony/Component/Validator/Constraints/Collection.php -@@ -61,5 +61,5 @@ class Collection extends Composite +@@ -60,5 +60,5 @@ class Collection extends Composite * @return void */ - protected function initializeNestedConstraints() @@ -12764,7 +12785,7 @@ diff --git a/src/Symfony/Component/Validator/Constraints/ExpressionValidator.php diff --git a/src/Symfony/Component/Validator/Constraints/File.php b/src/Symfony/Component/Validator/Constraints/File.php --- a/src/Symfony/Component/Validator/Constraints/File.php +++ b/src/Symfony/Component/Validator/Constraints/File.php -@@ -134,5 +134,5 @@ class File extends Constraint +@@ -135,5 +135,5 @@ class File extends Constraint * @return void */ - public function __set(string $option, mixed $value) @@ -12794,7 +12815,7 @@ diff --git a/src/Symfony/Component/Validator/Constraints/HostnameValidator.php b diff --git a/src/Symfony/Component/Validator/Constraints/IbanValidator.php b/src/Symfony/Component/Validator/Constraints/IbanValidator.php --- a/src/Symfony/Component/Validator/Constraints/IbanValidator.php +++ b/src/Symfony/Component/Validator/Constraints/IbanValidator.php -@@ -167,5 +167,5 @@ class IbanValidator extends ConstraintValidator +@@ -171,5 +171,5 @@ class IbanValidator extends ConstraintValidator * @return void */ - public function validate(mixed $value, Constraint $constraint) @@ -12878,8 +12899,8 @@ diff --git a/src/Symfony/Component/Validator/Constraints/IsbnValidator.php b/src @@ -179,5 +179,5 @@ class IsbnValidator extends ConstraintValidator * @return string */ -- protected function getMessage(Isbn $constraint, string $type = null) -+ protected function getMessage(Isbn $constraint, string $type = null): string +- protected function getMessage(Isbn $constraint, ?string $type = null) ++ protected function getMessage(Isbn $constraint, ?string $type = null): string { if (null !== $constraint->message) { diff --git a/src/Symfony/Component/Validator/Constraints/IsinValidator.php b/src/Symfony/Component/Validator/Constraints/IsinValidator.php @@ -12905,7 +12926,7 @@ diff --git a/src/Symfony/Component/Validator/Constraints/IssnValidator.php b/src diff --git a/src/Symfony/Component/Validator/Constraints/JsonValidator.php b/src/Symfony/Component/Validator/Constraints/JsonValidator.php --- a/src/Symfony/Component/Validator/Constraints/JsonValidator.php +++ b/src/Symfony/Component/Validator/Constraints/JsonValidator.php -@@ -24,5 +24,5 @@ class JsonValidator extends ConstraintValidator +@@ -25,5 +25,5 @@ class JsonValidator extends ConstraintValidator * @return void */ - public function validate(mixed $value, Constraint $constraint) @@ -12995,7 +13016,7 @@ diff --git a/src/Symfony/Component/Validator/Constraints/NotNullValidator.php b/ diff --git a/src/Symfony/Component/Validator/Constraints/RangeValidator.php b/src/Symfony/Component/Validator/Constraints/RangeValidator.php --- a/src/Symfony/Component/Validator/Constraints/RangeValidator.php +++ b/src/Symfony/Component/Validator/Constraints/RangeValidator.php -@@ -35,5 +35,5 @@ class RangeValidator extends ConstraintValidator +@@ -36,5 +36,5 @@ class RangeValidator extends ConstraintValidator * @return void */ - public function validate(mixed $value, Constraint $constraint) @@ -13266,7 +13287,7 @@ diff --git a/src/Symfony/Component/Validator/ObjectInitializerInterface.php b/sr diff --git a/src/Symfony/Component/Validator/Test/ConstraintValidatorTestCase.php b/src/Symfony/Component/Validator/Test/ConstraintValidatorTestCase.php --- a/src/Symfony/Component/Validator/Test/ConstraintValidatorTestCase.php +++ b/src/Symfony/Component/Validator/Test/ConstraintValidatorTestCase.php -@@ -291,5 +291,5 @@ abstract class ConstraintValidatorTestCase extends TestCase +@@ -294,5 +294,5 @@ abstract class ConstraintValidatorTestCase extends TestCase * @psalm-return T */ - abstract protected function createValidator(); @@ -13385,63 +13406,63 @@ diff --git a/src/Symfony/Component/VarDumper/Caster/DOMCaster.php b/src/Symfony/ + public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, bool $isNested, int $filter = 0): array { $a += [ -@@ -188,5 +188,5 @@ class DOMCaster +@@ -184,5 +184,5 @@ class DOMCaster * @return array */ - public static function castCharacterData(\DOMCharacterData $dom, array $a, Stub $stub, bool $isNested) + public static function castCharacterData(\DOMCharacterData $dom, array $a, Stub $stub, bool $isNested): array { $a += [ -@@ -201,5 +201,5 @@ class DOMCaster +@@ -197,5 +197,5 @@ class DOMCaster * @return array */ - public static function castAttr(\DOMAttr $dom, array $a, Stub $stub, bool $isNested) + public static function castAttr(\DOMAttr $dom, array $a, Stub $stub, bool $isNested): array { $a += [ -@@ -217,5 +217,5 @@ class DOMCaster +@@ -213,5 +213,5 @@ class DOMCaster * @return array */ - public static function castElement(\DOMElement $dom, array $a, Stub $stub, bool $isNested) + public static function castElement(\DOMElement $dom, array $a, Stub $stub, bool $isNested): array { $a += [ -@@ -230,5 +230,5 @@ class DOMCaster +@@ -226,5 +226,5 @@ class DOMCaster * @return array */ - public static function castText(\DOMText $dom, array $a, Stub $stub, bool $isNested) + public static function castText(\DOMText $dom, array $a, Stub $stub, bool $isNested): array { $a += [ -@@ -242,5 +242,5 @@ class DOMCaster +@@ -238,5 +238,5 @@ class DOMCaster * @return array */ - public static function castDocumentType(\DOMDocumentType $dom, array $a, Stub $stub, bool $isNested) + public static function castDocumentType(\DOMDocumentType $dom, array $a, Stub $stub, bool $isNested): array { $a += [ -@@ -259,5 +259,5 @@ class DOMCaster +@@ -255,5 +255,5 @@ class DOMCaster * @return array */ - public static function castNotation(\DOMNotation $dom, array $a, Stub $stub, bool $isNested) + public static function castNotation(\DOMNotation $dom, array $a, Stub $stub, bool $isNested): array { $a += [ -@@ -272,5 +272,5 @@ class DOMCaster +@@ -268,5 +268,5 @@ class DOMCaster * @return array */ - public static function castEntity(\DOMEntity $dom, array $a, Stub $stub, bool $isNested) + public static function castEntity(\DOMEntity $dom, array $a, Stub $stub, bool $isNested): array { $a += [ -@@ -289,5 +289,5 @@ class DOMCaster +@@ -282,5 +282,5 @@ class DOMCaster * @return array */ - public static function castProcessingInstruction(\DOMProcessingInstruction $dom, array $a, Stub $stub, bool $isNested) + public static function castProcessingInstruction(\DOMProcessingInstruction $dom, array $a, Stub $stub, bool $isNested): array { $a += [ -@@ -302,5 +302,5 @@ class DOMCaster +@@ -295,5 +295,5 @@ class DOMCaster * @return array */ - public static function castXPath(\DOMXPath $dom, array $a, Stub $stub, bool $isNested) @@ -13812,78 +13833,78 @@ diff --git a/src/Symfony/Component/VarDumper/Caster/ReflectionCaster.php b/src/S - public static function castAttribute(\ReflectionAttribute $c, array $a, Stub $stub, bool $isNested) + public static function castAttribute(\ReflectionAttribute $c, array $a, Stub $stub, bool $isNested): array { - self::addMap($a, $c, [ -@@ -140,5 +140,5 @@ class ReflectionCaster + $map = [ +@@ -146,5 +146,5 @@ class ReflectionCaster * @return array */ - public static function castReflectionGenerator(\ReflectionGenerator $c, array $a, Stub $stub, bool $isNested) + public static function castReflectionGenerator(\ReflectionGenerator $c, array $a, Stub $stub, bool $isNested): array { $prefix = Caster::PREFIX_VIRTUAL; -@@ -178,5 +178,5 @@ class ReflectionCaster +@@ -184,5 +184,5 @@ class ReflectionCaster * @return array */ - public static function castClass(\ReflectionClass $c, array $a, Stub $stub, bool $isNested, int $filter = 0) + public static function castClass(\ReflectionClass $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array { $prefix = Caster::PREFIX_VIRTUAL; -@@ -212,5 +212,5 @@ class ReflectionCaster +@@ -218,5 +218,5 @@ class ReflectionCaster * @return array */ - public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, array $a, Stub $stub, bool $isNested, int $filter = 0) + public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, array $a, Stub $stub, bool $isNested, int $filter = 0): array { $prefix = Caster::PREFIX_VIRTUAL; -@@ -273,5 +273,5 @@ class ReflectionCaster +@@ -279,5 +279,5 @@ class ReflectionCaster * @return array */ - public static function castClassConstant(\ReflectionClassConstant $c, array $a, Stub $stub, bool $isNested) + public static function castClassConstant(\ReflectionClassConstant $c, array $a, Stub $stub, bool $isNested): array { $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); -@@ -286,5 +286,5 @@ class ReflectionCaster +@@ -292,5 +292,5 @@ class ReflectionCaster * @return array */ - public static function castMethod(\ReflectionMethod $c, array $a, Stub $stub, bool $isNested) + public static function castMethod(\ReflectionMethod $c, array $a, Stub $stub, bool $isNested): array { $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); -@@ -296,5 +296,5 @@ class ReflectionCaster +@@ -302,5 +302,5 @@ class ReflectionCaster * @return array */ - public static function castParameter(\ReflectionParameter $c, array $a, Stub $stub, bool $isNested) + public static function castParameter(\ReflectionParameter $c, array $a, Stub $stub, bool $isNested): array { $prefix = Caster::PREFIX_VIRTUAL; -@@ -339,5 +339,5 @@ class ReflectionCaster +@@ -345,5 +345,5 @@ class ReflectionCaster * @return array */ - public static function castProperty(\ReflectionProperty $c, array $a, Stub $stub, bool $isNested) + public static function castProperty(\ReflectionProperty $c, array $a, Stub $stub, bool $isNested): array { $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers())); -@@ -352,5 +352,5 @@ class ReflectionCaster +@@ -358,5 +358,5 @@ class ReflectionCaster * @return array */ - public static function castReference(\ReflectionReference $c, array $a, Stub $stub, bool $isNested) + public static function castReference(\ReflectionReference $c, array $a, Stub $stub, bool $isNested): array { $a[Caster::PREFIX_VIRTUAL.'id'] = $c->getId(); -@@ -362,5 +362,5 @@ class ReflectionCaster +@@ -368,5 +368,5 @@ class ReflectionCaster * @return array */ - public static function castExtension(\ReflectionExtension $c, array $a, Stub $stub, bool $isNested) + public static function castExtension(\ReflectionExtension $c, array $a, Stub $stub, bool $isNested): array { self::addMap($a, $c, [ -@@ -381,5 +381,5 @@ class ReflectionCaster +@@ -387,5 +387,5 @@ class ReflectionCaster * @return array */ - public static function castZendExtension(\ReflectionZendExtension $c, array $a, Stub $stub, bool $isNested) + public static function castZendExtension(\ReflectionZendExtension $c, array $a, Stub $stub, bool $isNested): array { self::addMap($a, $c, [ -@@ -396,5 +396,5 @@ class ReflectionCaster +@@ -402,5 +402,5 @@ class ReflectionCaster * @return string */ - public static function getSignature(array $a) @@ -14202,84 +14223,84 @@ diff --git a/src/Symfony/Component/VarDumper/Dumper/AbstractDumper.php b/src/Sym diff --git a/src/Symfony/Component/VarDumper/Dumper/CliDumper.php b/src/Symfony/Component/VarDumper/Dumper/CliDumper.php --- a/src/Symfony/Component/VarDumper/Dumper/CliDumper.php +++ b/src/Symfony/Component/VarDumper/Dumper/CliDumper.php -@@ -91,5 +91,5 @@ class CliDumper extends AbstractDumper +@@ -92,5 +92,5 @@ class CliDumper extends AbstractDumper * @return void */ - public function setColors(bool $colors) + public function setColors(bool $colors): void { $this->colors = $colors; -@@ -101,5 +101,5 @@ class CliDumper extends AbstractDumper +@@ -102,5 +102,5 @@ class CliDumper extends AbstractDumper * @return void */ - public function setMaxStringWidth(int $maxStringWidth) + public function setMaxStringWidth(int $maxStringWidth): void { $this->maxStringWidth = $maxStringWidth; -@@ -113,5 +113,5 @@ class CliDumper extends AbstractDumper +@@ -114,5 +114,5 @@ class CliDumper extends AbstractDumper * @return void */ - public function setStyles(array $styles) + public function setStyles(array $styles): void { $this->styles = $styles + $this->styles; -@@ -125,5 +125,5 @@ class CliDumper extends AbstractDumper +@@ -126,5 +126,5 @@ class CliDumper extends AbstractDumper * @return void */ - public function setDisplayOptions(array $displayOptions) + public function setDisplayOptions(array $displayOptions): void { $this->displayOptions = $displayOptions + $this->displayOptions; -@@ -133,5 +133,5 @@ class CliDumper extends AbstractDumper +@@ -134,5 +134,5 @@ class CliDumper extends AbstractDumper * @return void */ - public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|null $value) + public function dumpScalar(Cursor $cursor, string $type, string|int|float|bool|null $value): void { $this->dumpKey($cursor); -@@ -197,5 +197,5 @@ class CliDumper extends AbstractDumper +@@ -198,5 +198,5 @@ class CliDumper extends AbstractDumper * @return void */ - public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut) + public function dumpString(Cursor $cursor, string $str, bool $bin, int $cut): void { $this->dumpKey($cursor); -@@ -289,5 +289,5 @@ class CliDumper extends AbstractDumper +@@ -290,5 +290,5 @@ class CliDumper extends AbstractDumper * @return void */ - public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild) + public function enterHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild): void { $this->colors ??= $this->supportsColors(); -@@ -329,5 +329,5 @@ class CliDumper extends AbstractDumper +@@ -330,5 +330,5 @@ class CliDumper extends AbstractDumper * @return void */ - public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut) + public function leaveHash(Cursor $cursor, int $type, string|int|null $class, bool $hasChild, int $cut): void { if (empty($cursor->attr['cut_hash'])) { -@@ -347,5 +347,5 @@ class CliDumper extends AbstractDumper +@@ -348,5 +348,5 @@ class CliDumper extends AbstractDumper * @return void */ - protected function dumpEllipsis(Cursor $cursor, bool $hasChild, int $cut) + protected function dumpEllipsis(Cursor $cursor, bool $hasChild, int $cut): void { if ($cut) { -@@ -365,5 +365,5 @@ class CliDumper extends AbstractDumper +@@ -366,5 +366,5 @@ class CliDumper extends AbstractDumper * @return void */ - protected function dumpKey(Cursor $cursor) + protected function dumpKey(Cursor $cursor): void { if (null !== $key = $cursor->hashKey) { -@@ -576,5 +576,5 @@ class CliDumper extends AbstractDumper +@@ -577,5 +577,5 @@ class CliDumper extends AbstractDumper * @return void */ - protected function dumpLine(int $depth, bool $endOfValue = false) + protected function dumpLine(int $depth, bool $endOfValue = false): void { - if ($this->colors) { -@@ -587,5 +587,5 @@ class CliDumper extends AbstractDumper + if (null === $this->colors) { +@@ -592,5 +592,5 @@ class CliDumper extends AbstractDumper * @return void */ - protected function endValue(Cursor $cursor) @@ -14563,8 +14584,8 @@ diff --git a/src/Symfony/Component/Workflow/Metadata/GetMetadataTrait.php b/src/ @@ -22,5 +22,5 @@ trait GetMetadataTrait * @return mixed */ -- public function getMetadata(string $key, string|Transition $subject = null) -+ public function getMetadata(string $key, string|Transition $subject = null): mixed +- public function getMetadata(string $key, string|Transition|null $subject = null) ++ public function getMetadata(string $key, string|Transition|null $subject = null): mixed { if (null === $subject) { diff --git a/src/Symfony/Component/Workflow/Metadata/MetadataStoreInterface.php b/src/Symfony/Component/Workflow/Metadata/MetadataStoreInterface.php @@ -14573,8 +14594,8 @@ diff --git a/src/Symfony/Component/Workflow/Metadata/MetadataStoreInterface.php @@ -38,4 +38,4 @@ interface MetadataStoreInterface * @return mixed */ -- public function getMetadata(string $key, string|Transition $subject = null); -+ public function getMetadata(string $key, string|Transition $subject = null): mixed; +- public function getMetadata(string $key, string|Transition|null $subject = null); ++ public function getMetadata(string $key, string|Transition|null $subject = null): mixed; } diff --git a/src/Symfony/Component/Workflow/Registry.php b/src/Symfony/Component/Workflow/Registry.php --- a/src/Symfony/Component/Workflow/Registry.php diff --git a/.github/patch-types.php b/.github/patch-types.php index 76d3a07f03c2b..8a938f57c6e89 100644 --- a/.github/patch-types.php +++ b/.github/patch-types.php @@ -25,6 +25,7 @@ case false !== strpos($file, '/vendor/'): case false !== strpos($file, '/src/Symfony/Bridge/Doctrine/Logger/DbalLogger.php'): case false !== strpos($file, '/src/Symfony/Bridge/Doctrine/Middleware/Debug/'): + case false !== strpos($file, '/src/Symfony/Bridge/Doctrine/Tests/Fixtures/LegacyQueryMock.php'): case false !== strpos($file, '/src/Symfony/Bridge/PhpUnit/'): case false !== strpos($file, '/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/ContainerAwareController.php'): case false !== strpos($file, '/src/Symfony/Bundle/FrameworkBundle/Tests/Fixtures/Validation/Article.php'): diff --git a/.github/sync-packages.php b/.github/sync-packages.php new file mode 100644 index 0000000000000..8eb8db47c85e4 --- /dev/null +++ b/.github/sync-packages.php @@ -0,0 +1,57 @@ +formatOutput = true; + + $xliff = $dom->appendChild($dom->createElement('xliff')); + $xliff->setAttribute('version', '1.2'); + $xliff->setAttribute('xmlns', 'urn:oasis:names:tc:xliff:document:1.2'); + + $xliffFile = $xliff->appendChild($dom->createElement('file')); + $xliffFile->setAttribute('source-language', str_replace('_', '-', $defaultLocale)); + $xliffFile->setAttribute('target-language', 'no' === $messages->getLocale() ? 'nb' : str_replace('_', '-', $messages->getLocale())); + $xliffFile->setAttribute('datatype', 'plaintext'); + $xliffFile->setAttribute('original', 'file.ext'); + + if (null !== $header) { + mergeDom($dom, $xliffFile, $header); + } + + $xliffBody = $xliffFile->appendChild($dom->createElement('body')); + foreach ($messages->all($domain) as $source => $target) { + $translation = $dom->createElement('trans-unit'); + $metadata = $messages->getMetadata($source, $domain); + + $translation->setAttribute('id', $metadata['id']); + if (isset($metadata['resname'])) { + $translation->setAttribute('resname', $metadata['resname']); + } + + $s = $translation->appendChild($dom->createElement('source')); + $s->appendChild($dom->createTextNode($source)); + + $text = 1 === preg_match('/[&<>]/', $target) ? $dom->createCDATASection($target) : $dom->createTextNode($target); + + $targetElement = $dom->createElement('target'); + + if ('en' !== $messages->getLocale() && $target === $source && 'Error' !== $source) { + $targetElement->setAttribute('state', 'needs-translation'); + } + if (isset($metadata['target-attributes'])) { + foreach ($metadata['target-attributes'] as $key => $value) { + $targetElement->setAttribute($key, $value); + } + } + + $t = $translation->appendChild($targetElement); + $t->appendChild($text); + + $xliffBody->appendChild($translation); + } + + return preg_replace('/^ +/m', '$0$0', $dom->saveXML()); +} + +function mergeDom(\DOMDocument $dom, \DOMNode $tree, \DOMNode $input) +{ + $new = $dom->createElement($input->tagName); + foreach ($input->attributes as $key => $value) { + $new->setAttribute($key, $value); + } + $tree->appendChild($new); + foreach ($input->childNodes as $child) { + if ($child instanceof \DOMText) { + $new->appendChild($dom->createTextNode(str_replace(' ', ' ', $child->textContent))); + } elseif ($child instanceof \DOMNode) { + mergeDom($dom, $new, $child); + } else { + // We just need to update our script to handle this node types + throw new \LogicException('Unsupported node type: '.get_class($child)); + } + } +} + +foreach (['Security/Core' => 'security', 'Form' => 'validators', 'Validator' => 'validators'] as $component => $domain) { + $dir = __DIR__.'/../src/Symfony/Component/'.$component.'/Resources/translations'; + + $enCatalogue = (new XliffFileLoader())->load($dir.'/'.$domain.'.en.xlf', 'en', $domain); + file_put_contents($dir.'/'.$domain.'.en.xlf', dumpXliff1('en', $enCatalogue, $domain)); + + $finder = new Finder(); + + foreach ($finder->files()->in($dir)->name('*.xlf') as $file) { + $locale = substr($file->getBasename(), 1 + strlen($domain), -4); + + if ('en' === $locale) { + continue; + } + + $catalogue = (new XliffFileLoader())->load($file, $locale, $domain); + $localeCatalogue = new MessageCatalogue($locale); + + foreach ($enCatalogue->all($domain) as $resname => $source) { + $metadata = []; + if ($catalogue->defines($resname, $domain)) { + $translation = $catalogue->get($resname, $domain); + $metadata = $catalogue->getMetadata($resname, $domain); + } else { + $translation = $source; + } + $metadata['id'] = $enCatalogue->getMetadata($resname, $domain)['id']; + if ($resname !== $source) { + $metadata['resname'] = $resname; + } + $localeCatalogue->set($source, $translation, $domain); + $localeCatalogue->setMetadata($source, $metadata, $domain); + } + + $inputDom = new \DOMDocument(); + $inputDom->loadXML(file_get_contents($file->getRealPath())); + $header = null; + if (1 === $inputDom->getElementsByTagName('header')->count()) { + $header = $inputDom->getElementsByTagName('header')->item(0); + } + + file_put_contents($file, dumpXliff1('en', $localeCatalogue, $domain, $header)); + } +} diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 9be997ff548c4..9ee1445e2c12d 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -19,7 +19,7 @@ jobs: tests: name: Integration - runs-on: Ubuntu-20.04 + runs-on: ubuntu-24.04 strategy: matrix: @@ -44,10 +44,23 @@ jobs: LDAP_PORT_NUMBER: 3389 LDAP_USERS: a LDAP_PASSWORDS: a + ftp: + image: onekilo79/ftpd_test + ports: + - 21:21 + - 30000-30009:30000-30009 + volumes: + - ./:/hostmount redis: image: redis:6.2.8 ports: - 16379:6379 + redis-authenticated: + image: redis:6.2.8 + ports: + - 16380:6379 + env: + REDIS_ARGS: "--requirepass p@ssword" redis-cluster: image: grokzen/redis-cluster:6.2.8 ports: @@ -68,6 +81,26 @@ jobs: REDIS_MASTER_HOST: redis REDIS_MASTER_SET: redis_sentinel REDIS_SENTINEL_QUORUM: 1 + redis-primary: + image: bitnami/redis:latest + ports: + - 16381:6379 + env: + ALLOW_EMPTY_PASSWORD: "yes" + REDIS_REPLICATION_MODE: "master" + options: >- + --name=redis-primary + redis-replica: + image: bitnami/redis:latest + ports: + - 16382:6379 + env: + ALLOW_EMPTY_PASSWORD: "yes" + REDIS_REPLICATION_MODE: "slave" + REDIS_MASTER_HOST: redis-primary + REDIS_MASTER_PORT_NUMBER: "6379" + options: >- + --name=redis-replica memcached: image: memcached:1.6.5 ports: @@ -89,31 +122,57 @@ jobs: - 8094:8094 - 11210:11210 sqs: - image: asyncaws/testing-sqs + image: localstack/localstack:3.0.2 ports: - - 9494:9494 + - 4566:4566 zookeeper: - image: wurstmeister/zookeeper:3.4.6 + image: zookeeper kafka: - image: wurstmeister/kafka:2.12-2.0.1 + image: bitnami/kafka:3.7 ports: - 9092:9092 env: - KAFKA_AUTO_CREATE_TOPICS_ENABLE: false - KAFKA_CREATE_TOPICS: 'test-topic:1:1:compact' - KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1 - KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' - KAFKA_ADVERTISED_PORT: 9092 + KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE: false + ALLOW_PLAINTEXT_LISTENER: 'yes' + KAFKA_CFG_ADVERTISED_LISTENERS: 'PLAINTEXT://127.0.0.1:9092' + KAFKA_CFG_LISTENERS: 'PLAINTEXT://:9092' + KAFKA_CFG_ZOOKEEPER_CONNECT: 'zookeeper:2181' + options: --name=kafka + frankenphp: + image: dunglas/frankenphp:1.1.0 + ports: + - 80:80 + - 8681:81 + - 8682:82 + - 8683:83 + - 8684:84 + volumes: + - ${{ github.workspace }}:/symfony + env: + SERVER_NAME: 'http://localhost http://localhost:81 http://localhost:82 http://localhost:83 http://localhost:84' + CADDY_SERVER_EXTRA_DIRECTIVES: | + route /http-client* { + root * /symfony/src/Symfony/Component/HttpClient/Tests/Fixtures/response-functional/ + php_server + } + + root * /symfony/src/Symfony/Component/HttpFoundation/Tests/Fixtures/response-functional/ steps: - name: Checkout uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Init Kafka topics + run: | + docker exec kafka /opt/bitnami/kafka/bin/kafka-topics.sh --create --topic test-topic --bootstrap-server kafka:9092 - name: Install system dependencies run: | echo "::group::apt-get update" sudo wget -O - https://packages.couchbase.com/clients/c/repos/deb/couchbase.key | sudo apt-key add - - echo "deb https://packages.couchbase.com/clients/c/repos/deb/ubuntu2004 focal focal/main" | sudo tee /etc/apt/sources.list.d/couchbase.list + echo "deb https://packages.couchbase.com/clients/c/repos/deb/ubuntu2404 noble noble/main" | sudo tee /etc/apt/sources.list.d/couchbase.list sudo apt-get update echo "::endgroup::" @@ -124,6 +183,14 @@ jobs: sudo service redis-server restart echo "::endgroup::" + - name: Install pgbouncer + run: | + sudo apt-get install -y pgbouncer + sudo cp src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Fixtures/pgbouncer/pgbouncer.ini /etc/pgbouncer/pgbouncer.ini + sudo cp src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Fixtures/pgbouncer/userlist.txt /etc/pgbouncer/userlist.txt + sudo service pgbouncer restart + sudo su - postgres -c "PGPASSWORD=password psql -Atq -h localhost -p 5432 -U postgres -d postgres -c \"SELECT usename, passwd FROM pg_shadow\"" + - name: Configure Couchbase run: | curl -s -u 'username=Administrator&password=111111' -X POST http://localhost:8091/node/controller/setupServices -d 'services=kv%2Cn1ql%2Cindex%2Cfts' @@ -131,6 +198,11 @@ jobs: curl -s -u Administrator:111111 -X POST http://localhost:8091/pools/default/buckets -d 'ramQuotaMB=100&bucketType=ephemeral&name=cache' curl -s -u Administrator:111111 -X POST http://localhost:8091/pools/default -d 'memoryQuota=256' + - name: Create FTP fixtures + run: | + mkdir -p ./ftpusers/test/pub + touch ./ftpusers/test/pub/example ./ftpusers/test/readme.txt + - name: Setup PHP uses: shivammathur/setup-php@v2 with: @@ -166,19 +238,35 @@ jobs: ./phpunit install echo "::endgroup::" + - name: Check for changes in translation files + id: changed-translation-files + run: | + echo 'changed='$((git diff --quiet HEAD~1 HEAD -- 'src/**/Resources/translations/*.xlf' || (echo 'true' && exit 1)) && echo 'false') >> $GITHUB_OUTPUT + + - name: Check Translation Status + if: steps.changed-translation-files.outputs.changed == 'true' + run: | + php src/Symfony/Component/Translation/Resources/bin/translation-status.php -v + php .github/sync-translations.php + git diff --exit-code src/ || (echo '::error::Run "php .github/sync-translations.php" to fix XLIFF files.' && exit 1) + - name: Run tests run: ./phpunit --group integration -v env: + INTEGRATION_FTP_URL: 'ftp://test:test@localhost' REDIS_HOST: 'localhost:16379' + REDIS_AUTHENTICATED_HOST: 'localhost:16380' REDIS_CLUSTER_HOSTS: 'localhost:7000 localhost:7001 localhost:7002 localhost:7003 localhost:7004 localhost:7005' REDIS_SENTINEL_HOSTS: 'unreachable-host:26379 localhost:26379 localhost:26379' REDIS_SENTINEL_SERVICE: redis_sentinel + REDIS_REPLICATION_HOSTS: 'localhost:16382 localhost:16381' MESSENGER_REDIS_DSN: redis://127.0.0.1:7006/messages MESSENGER_AMQP_DSN: amqp://localhost/%2f/messages - MESSENGER_SQS_DSN: "sqs://localhost:9494/messages?sslmode=disable&poll_timeout=0.01" - MESSENGER_SQS_FIFO_QUEUE_DSN: "sqs://localhost:9494/messages.fifo?sslmode=disable&poll_timeout=0.01" + MESSENGER_SQS_DSN: "sqs://localhost:4566/messages?sslmode=disable&poll_timeout=0.01" + MESSENGER_SQS_FIFO_QUEUE_DSN: "sqs://localhost:4566/messages.fifo?sslmode=disable&poll_timeout=0.01" KAFKA_BROKER: 127.0.0.1:9092 POSTGRES_HOST: localhost + PGBOUNCER_HOST: localhost:6432 #- name: Run HTTP push tests # if: matrix.php == '8.1' @@ -188,13 +276,3 @@ jobs: # docker run --rm -e COMPOSER_ROOT_VERSION -v $(pwd):/app -v $(which composer):/usr/local/bin/composer -v $(which vulcain):/usr/local/bin/vulcain -w /app php:8.1-alpine ./phpunit src/Symfony/Component/HttpClient/Tests/CurlHttpClientTest.php --filter testHttp2Push # sudo rm -rf .phpunit # [ -d .phpunit.bak ] && mv .phpunit.bak .phpunit - - - uses: marceloprado/has-changed-path@v1.0.1 - id: changed-translation-files - with: - paths: src/**/Resources/translations/*.xlf - - - name: Check Translation Status - if: steps.changed-translation-files.outputs.changed == 'true' - run: | - php src/Symfony/Component/Translation/Resources/bin/translation-status.php -v diff --git a/.github/workflows/intl-data-tests.yml b/.github/workflows/intl-data-tests.yml index 045c7fc8011d4..f51bb245896de 100644 --- a/.github/workflows/intl-data-tests.yml +++ b/.github/workflows/intl-data-tests.yml @@ -30,7 +30,7 @@ permissions: jobs: tests: name: Intl data - runs-on: Ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Checkout diff --git a/.github/workflows/package-tests.yml b/.github/workflows/package-tests.yml index 96b7451b7f945..4fa330f5e9688 100644 --- a/.github/workflows/package-tests.yml +++ b/.github/workflows/package-tests.yml @@ -11,7 +11,7 @@ permissions: jobs: verify: name: Verify Packages - runs-on: Ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Checkout code uses: actions/checkout@v4 diff --git a/.github/workflows/phpunit-bridge.yml b/.github/workflows/phpunit-bridge.yml index f63c02bc31925..c740fa57e2425 100644 --- a/.github/workflows/phpunit-bridge.yml +++ b/.github/workflows/phpunit-bridge.yml @@ -22,7 +22,7 @@ permissions: jobs: lint: name: Lint PhpUnitBridge - runs-on: Ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Checkout diff --git a/.github/workflows/psalm.yml b/.github/workflows/psalm.yml index a14c94d95cc70..a9fc913c24405 100644 --- a/.github/workflows/psalm.yml +++ b/.github/workflows/psalm.yml @@ -17,7 +17,7 @@ permissions: jobs: psalm: name: Psalm - runs-on: Ubuntu-20.04 + runs-on: ubuntu-24.04 env: php-version: '8.1' @@ -43,7 +43,7 @@ jobs: ([ -d "$COMPOSER_HOME" ] || mkdir "$COMPOSER_HOME") && cp .github/composer-config.json "$COMPOSER_HOME/config.json" export COMPOSER_ROOT_VERSION=$(grep ' VERSION = ' src/Symfony/Component/HttpKernel/Kernel.php | grep -P -o '[0-9]+\.[0-9]+').x-dev composer remove --dev --no-update --no-interaction symfony/phpunit-bridge - composer require --no-progress --ansi --no-plugins psalm/phar phpunit/phpunit:^9.5 php-http/discovery psr/event-dispatcher mongodb/mongodb jetbrains/phpstorm-stubs + composer require --no-progress --ansi --no-plugins psalm/phar:@stable phpunit/phpunit:^9.5 php-http/discovery psr/event-dispatcher mongodb/mongodb jetbrains/phpstorm-stubs - name: Generate Psalm baseline run: | diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index b66e1b53b60f4..677e6e6a30d91 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -6,7 +6,7 @@ on: schedule: - cron: '34 4 * * 6' push: - branches: [ "6.4" ] + branches: [ "7.4" ] # Declare default permissions as read only. permissions: read-all @@ -14,7 +14,7 @@ permissions: read-all jobs: analysis: name: Scorecards analysis - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: # Needed to upload the results to code-scanning dashboard. security-events: write diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 3dd27a6a3503b..8b9cf6b6e0cb1 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -32,10 +32,12 @@ jobs: - php: '8.2' mode: low-deps - php: '8.3' + - php: '8.4' + - php: '8.5' #mode: experimental fail-fast: false - runs-on: ubuntu-20.04 + runs-on: ubuntu-24.04 steps: - name: Checkout @@ -49,7 +51,7 @@ jobs: coverage: "none" ini-values: date.timezone=UTC,memory_limit=-1,default_socket_timeout=10,session.gc_probability=0,apc.enable_cli=1,zend.assertions=1 php-version: "${{ matrix.php }}" - extensions: "${{ env.extensions }}" + extensions: "${{ matrix.extensions || env.extensions }}" tools: flex - name: Configure environment @@ -59,13 +61,13 @@ jobs: git config --global init.defaultBranch main git config --global advice.detachedHead false - (php --ri relay 2>&1 > /dev/null) || sudo rm /etc/php/*/cli/conf.d/20-relay.ini + (php --ri relay 2>&1 > /dev/null) || sudo rm -f /etc/php/*/cli/conf.d/20-relay.ini COMPOSER_HOME="$(composer config home)" ([ -d "$COMPOSER_HOME" ] || mkdir "$COMPOSER_HOME") && cp .github/composer-config.json "$COMPOSER_HOME/config.json" echo COLUMNS=120 >> $GITHUB_ENV - echo PHPUNIT="$(pwd)/phpunit --exclude-group tty,benchmark,intl-data,integration" >> $GITHUB_ENV + echo PHPUNIT="$(pwd)/phpunit --exclude-group tty,benchmark,intl-data,integration,transient" >> $GITHUB_ENV echo COMPOSER_UP='composer update --no-progress --ansi'$([[ "${{ matrix.mode }}" != low-deps ]] && echo ' --ignore-platform-req=php+') >> $GITHUB_ENV SYMFONY_VERSIONS=$(git ls-remote -q --heads | cut -f2 | grep -o '/[1-9][0-9]*\.[0-9].*' | sort -V) @@ -90,7 +92,7 @@ jobs: # Create local composer packages for each patched components and reference them in composer.json files when cross-testing components if [[ ! "${{ matrix.mode }}" = *-deps ]]; then - php .github/build-packages.php HEAD^ $SYMFONY_VERSION src/Symfony/Bridge/PhpUnit + php .github/build-packages.php HEAD^ $SYMFONY_VERSION src/Symfony/Bridge/PhpUnit else echo SYMFONY_DEPRECATIONS_HELPER=weak >> $GITHUB_ENV cp composer.json composer.json.orig @@ -128,6 +130,10 @@ jobs: echo SYMFONY_REQUIRE=">=$([ '${{ matrix.mode }}' = low-deps ] && echo 5.4 || echo $SYMFONY_VERSION)" >> $GITHUB_ENV [[ "${{ matrix.mode }}" = *-deps ]] && mv composer.json.phpunit composer.json || true + if [[ "${{ matrix.mode }}" = low-deps ]]; then + echo SYMFONY_PHPUNIT_REQUIRE="nikic/php-parser:^4.18" >> $GITHUB_ENV + fi + - name: Install dependencies run: | echo "::group::composer update" @@ -161,12 +167,13 @@ jobs: local ok=0 local title="$1$FLIP" local start=$(date -u +%s) - OUTPUT=$(bash -xc "$2" 2>&1) || ok=1 + OUTPUT=$(bash -xc "$2" 2>&1) || ok=$? local end=$(date -u +%s) if [[ $ok -ne 0 ]]; then printf "\n%-70s%10s\n" $title $(($end-$start))s echo "$OUTPUT" + echo "Job exited with: $ok" echo -e "\n::error::KO $title\\n" else printf "::group::%-68s%10s\n" $title $(($end-$start))s @@ -194,8 +201,6 @@ jobs: echo "$COMPONENTS" | xargs -n1 | parallel -j +3 "_run_tests {} 'cd {} && $COMPOSER_UP && $PHPUNIT$LEGACY'" || X=1 # get a list of the patched components (relies on .github/build-packages.php being called in the previous step) - (cd src/Symfony/Component/HttpFoundation; mv composer.bak composer.json) - (cd src/Symfony/Component/Lock; mv composer.bak composer.json) PATCHED_COMPONENTS=$(git diff --name-only src/ | grep composer.json || true) # for 6.4 LTS, checkout and test previous major with the patched components (only for patched components) @@ -207,7 +212,7 @@ jobs: export SYMFONY_REQUIRE=">=$SYMFONY_VERSION" git fetch --depth=2 origin $SYMFONY_VERSION git checkout -m FETCH_HEAD - PATCHED_COMPONENTS=$(echo "$PATCHED_COMPONENTS" | xargs dirname | xargs -n1 -I{} bash -c "[ -e '{}/phpunit.xml.dist' ] && echo '{}'" | sort || true) + PATCHED_COMPONENTS=$(echo "$PATCHED_COMPONENTS" | xargs dirname | xargs -I{} bash -c "[ -e '{}/phpunit.xml.dist' ] && echo '{}'" | sort || true) if [[ $PATCHED_COMPONENTS ]]; then echo "::group::install phpunit" ./phpunit install diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000000000..e570564e9e9a3 --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,130 @@ +name: Windows + +on: + push: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + windows: + name: x86 / minimal-exts / lowest-php + + defaults: + run: + shell: pwsh + + runs-on: windows-2022 + + env: + COMPOSER_NO_INTERACTION: '1' + SYMFONY_DEPRECATIONS_HELPER: 'strict' + ANSICON: '121x90 (121x90)' + SYMFONY_PHPUNIT_DISABLE_RESULT_CACHE: '1' + + steps: + - name: Setup Git + run: | + git config --global core.autocrlf false + git config --global user.email "" + git config --global user.name "Symfony" + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - name: Setup PHP + run: | + $env:Path = 'c:\php;' + $env:Path + mkdir c:\php && cd c:\php + iwr -outf php-8.1.0-Win32-vs16-x86.zip https://github.com/symfony/binary-utils/releases/download/v0.1/php-8.1.0-Win32-vs16-x86.zip + 7z x php-8.1.0-Win32-vs16-x86.zip -y >nul + cd ext + iwr -outf php_apcu-5.1.21-8.1-ts-vs16-x86.zip https://github.com/symfony/binary-utils/releases/download/v0.1/php_apcu-5.1.21-8.1-ts-vs16-x86.zip + 7z x php_apcu-5.1.21-8.1-ts-vs16-x86.zip -y >nul + iwr -outf php_redis-5.3.7-8.1-ts-vs16-x86.zip https://github.com/symfony/binary-utils/releases/download/v0.1/php_redis-5.3.7-8.1-ts-vs16-x86.zip + 7z x php_redis-5.3.7-8.1-ts-vs16-x86.zip -y >nul + cd .. + Copy php.ini-development php.ini-min + "memory_limit=-1" >> php.ini-min + "serialize_precision=-1" >> php.ini-min + "max_execution_time=1200" >> php.ini-min + "post_max_size=2047M" >> php.ini-min + "upload_max_filesize=2047M" >> php.ini-min + "date.timezone=`"America/Los_Angeles`"" >> php.ini-min + "extension_dir=ext" >> php.ini-min + "extension=php_xsl.dll" >> php.ini-min + "extension=php_mbstring.dll" >> php.ini-min + Copy php.ini-min php.ini-max + "zend_extension=php_opcache.dll" >> php.ini-max + "opcache.enable_cli=1" >> php.ini-max + "extension=php_openssl.dll" >> php.ini-max + "extension=php_apcu.dll" >> php.ini-max + "extension=php_redis.dll" >> php.ini-max + "apc.enable_cli=1" >> php.ini-max + "extension=php_intl.dll" >> php.ini-max + "extension=php_fileinfo.dll" >> php.ini-max + "extension=php_pdo_sqlite.dll" >> php.ini-max + "extension=php_curl.dll" >> php.ini-max + "extension=php_sodium.dll" >> php.ini-max + Copy php.ini-max php.ini + cd ${{ github.workspace }} + iwr -outf composer.phar https://getcomposer.org/download/latest-stable/composer.phar + + - name: Install dependencies + id: setup + run: | + $env:Path = 'c:\php;' + $env:Path + mkdir $env:APPDATA\Composer && Copy .github\composer-config.json $env:APPDATA\Composer\config.json + + $env:SYMFONY_VERSION=(Select-String -CaseSensitive -Pattern " VERSION =" -SimpleMatch -Path src/Symfony/Component/HttpKernel/Kernel.php | Select Line | Select-String -Pattern "([0-9][0-9]*\.[0-9])").Matches.Value + $env:COMPOSER_ROOT_VERSION=$env:SYMFONY_VERSION + ".x-dev" + + php .github/build-packages.php HEAD^ $env:SYMFONY_VERSION src\Symfony\Bridge\PhpUnit + php composer.phar update --no-progress --ansi + + - name: Install PHPUnit + run: | + $env:Path = 'c:\php;' + $env:Path + + php phpunit install + + - name: Install memurai-developer + run: | + choco install --no-progress memurai-developer + + - name: Run tests (minimal extensions) + if: always() && steps.setup.outcome == 'success' + run: | + $env:Path = 'c:\php;' + $env:Path + $env:SYMFONY_PHPUNIT_SKIPPED_TESTS = 'phpunit.skipped' + $x = 0 + + Copy c:\php\php.ini-min c:\php\php.ini + Remove-Item -Path src\Symfony\Bridge\PhpUnit -Recurse + mv src\Symfony\Component\HttpClient\phpunit.xml.dist src\Symfony\Component\HttpClient\phpunit.xml + php phpunit src\Symfony --exclude-group tty,benchmark,intl-data,network,transient-on-windows || ($x = 1) + # HttpClient tests need to run separately, they block when run with other components' tests concurrently + php phpunit src\Symfony\Component\HttpClient || ($x = 1) + + exit $x + + - name: Run tests + if: always() && steps.setup.outcome == 'success' + run: | + $env:Path = 'c:\php;' + $env:Path + $env:SYMFONY_PHPUNIT_SKIPPED_TESTS = 'phpunit.skipped' + $x = 0 + + Copy c:\php\php.ini-max c:\php\php.ini + php phpunit src\Symfony --exclude-group tty,benchmark,intl-data,network,transient-on-windows || ($x = 1) + # HttpClient tests need to run separately, they block when run with other components' tests concurrently + php phpunit src\Symfony\Component\HttpClient || ($x = 1) + + exit $x diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 48c4f276b34a5..589a3c8cf6b65 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -23,21 +23,25 @@ EOF; return (new PhpCsFixer\Config()) + // @see https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/pull/7777 + ->setParallelConfig(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect()) ->setRules([ '@PHP71Migration' => true, '@PHPUnit75Migration:risky' => true, '@Symfony' => true, '@Symfony:risky' => true, 'protected_to_private' => false, - 'native_constant_invocation' => ['strict' => false], 'no_superfluous_phpdoc_tags' => [ 'remove_inheritdoc' => true, 'allow_unused_params' => true, // for future-ready params, to be replaced with https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues/7377 ], 'header_comment' => ['header' => $fileHeaderComment], + // TODO: Remove once the "compiler_optimized" set includes "sprintf" + 'native_function_invocation' => ['include' => ['@compiler_optimized', 'sprintf'], 'scope' => 'namespaced', 'strict' => true], + 'nullable_type_declaration' => true, + 'nullable_type_declaration_for_default_null_value' => true, 'modernize_strpos' => true, 'get_class_to_class_keyword' => true, - 'nullable_type_declaration' => true, ]) ->setRiskyAllowed(true) ->setFinder( @@ -46,11 +50,6 @@ ->append([__FILE__]) ->notPath('#/Fixtures/#') ->exclude([ - // directories containing files with content that is autogenerated by `var_export`, which breaks CS in output code - // fixture templates - 'Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Resources/Custom', - // resource templates - 'Symfony/Bundle/FrameworkBundle/Resources/views/Form', // explicit trigger_error tests 'Symfony/Bridge/PhpUnit/Tests/DeprecationErrorHandler/', 'Symfony/Component/Intl/Resources/data/', @@ -64,10 +63,6 @@ ->notPath('#Symfony/Bridge/PhpUnit/.*Legacy#') // file content autogenerated by `var_export` ->notPath('Symfony/Component/Translation/Tests/Fixtures/resources.php') - // file content autogenerated by `VarExporter::export` - ->notPath('Symfony/Component/Serializer/Tests/Fixtures/serializer.class.metadata.php') - // test template - ->notPath('Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/Resources/Custom/_name_entry_label.html.php') // explicit trigger_error tests ->notPath('Symfony/Component/ErrorHandler/Tests/DebugClassLoaderTest.php') // stop removing spaces on the end of the line in strings @@ -78,6 +73,10 @@ ->notPath('Symfony/Component/Cache/Traits/Redis6Proxy.php') ->notPath('Symfony/Component/Cache/Traits/RedisCluster5Proxy.php') ->notPath('Symfony/Component/Cache/Traits/RedisCluster6Proxy.php') + // svg + ->notPath('Symfony/Component/ErrorHandler/Resources/assets/images/symfony-ghost.svg.php') + // HTML templates + ->notPath('#Symfony/.*\.html\.php#') ) ->setCacheFile('.php-cs-fixer.cache') ; diff --git a/CHANGELOG-6.3.md b/CHANGELOG-6.3.md index b42b158c1056c..91840e5e6ecd5 100644 --- a/CHANGELOG-6.3.md +++ b/CHANGELOG-6.3.md @@ -7,6 +7,160 @@ in 6.3 minor versions. To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v6.3.0...v6.3.1 +* 6.3.12 (2024-01-30) + + * bug #52913 [Routing] Fixed priority getting lost when setting localized prefix (pritasil) + * bug #53183 [Messenger] PhpSerializer: TypeError should throw `MessageDecodingFailedException` (B-Galati) + * bug #52131 [HttpKernel] Fix `RequestPayloadValueResolver` handling error with no ExpectedTypes (Jeroeny) + * bug #51559 [DependencyInjection] `#[Autowire]` attribute should have precedence over bindings (HypeMC) + * bug #53678 [Mime] Fix serializing uninitialized `RawMessage::$message` to null (nicolas-grekas) + * bug #53634 [Notifer][Smsapi] Set messageId of SentMessage (tomasz-kusy) + * bug #53501 [DependencyInjection] support lazy evaluated exception messages with Xdebug 3 (xabbuh) + * bug #52994 [MonologBridge] Fix context data and display extra data (louismariegaborit) + * bug #53671 [HttpClient] Fix pausing responses before they start when using curl (nicolas-grekas) + * bug #53663 [TwigBridge] separate child and parent context in NotificationEmail on writes (xabbuh) + * bug #53667 [Mailer] [Mailgun] Fix sender header encoding (spajxo) + * bug #53157 [Mailer] Throw `TransportException` when unable to read from socket (xdanik) + * bug #53361 [Serializer] Take unnamed variadic parameters into account when denormalizing (thijsBreker) + * bug #53530 [Serializer] Rewrite `AbstractObjectNormalizer::createChildContext()` to use the provided `cache_key` from original context when creating child contexts (amne) + * bug #53506 [HttpClient] Fix error chunk creation in passthru (rmikalkenas) + * bug #53260 [AssetMapper] Handle assets with non-ascii characters in dev server (fbourigault) + * bug #53357 [Translation] Fix `TranslationNodeVisitor` with constant domain (VincentLanglet) + * bug #53525 [Messenger] [AMQP] Throw exception on `nack` callback (kvrushifa) + * bug #53432 [HttpFoundation] Request without content-type or content-length header should result in null values, not empty strings (priyadi) + * bug #53593 [Cache] Fix possible infinite loop in `CachePoolPass` (HypeMC) + * bug #53588 [Translation] fix multi-byte code area to convert (xabbuh) + * bug #53572 [FrameworkBundle] grab a service from the container only if it exists (xabbuh) + * bug #53565 [Mime] Fix undefined array key 0 when empty sender (0x346e3730) + * bug #53516 [Console] Allow '0' as a $shortcut in InputOption.php (lawsonjl-ornl) + * bug #53576 [Console] Only execute additional checks for color support if the output (theofidry) + * bug #53582 [TwigBundle] Fix configuration when "paths" is null (smnandre) + * bug #53575 [Mailer] register the MailPaceTransportFactory (xabbuh) + * bug #53581 [String] fix aircraft inflection (renanbr) + * bug #53509 [Security] Fix `AuthenticationUtils::getLastUsername()` returning null (alexandre-daubois) + * bug #53567 [String] Correct inflection of axis (Vladislav Iurciuc) + * bug #53537 [VarDumper] Fix missing colors initialization in `CliDumper` (nicolas-grekas) + * bug #53481 [Process] Fix executable finder when the command starts with a dash (kayw-geek) + * bug #53006 [ErrorHandler] Don't format binary strings (aleho) + * bug #53453 [Translation] add support for nikic/php-parser 5.0 (xabbuh) + * bug #53441 [Messenger] Amazon SQS Delay has a max of 15 minutes (alamirault) + * bug #53383 [Validator] re-allow an empty list of fields (xabbuh) + * bug #53418 [FrameworkBundle][Notifier] Fix service registration (MessageBird + TurboSms) (smnandre) + * bug #53350 [Validator] fix the exception being thrown (xabbuh) + * bug #53341 [FrameworkBundle] append instead of replacing potentially non-existent named-arguments (xabbuh) + * bug #53320 [Cache][DependencyInjection][Lock][Mailer][Messenger][Notifier][Translation] Url decode username and passwords from `parse_url()` results (alexandre-daubois) + * bug #53108 [Serializer] Fix using deserialization path 5.4 (HypeMC) + +* 6.3.11 (2023-12-30) + + * bug #53054 [Cache] Fix expiration time for CouchbaseCollection (alexandre-daubois) + * bug #53259 [RateLimit] Test and fix peeking behavior on rate limit policies (wouterj) + * bug #52406 [Validator] Fix `Constraints\Email::ERROR_NAMES` (mathroc) + * bug #53140 [Serializer] Skip uninitialized properties with deep_object_to_populate (mtarld) + * bug #53195 [HttpKernel] Fix default locale is ignored when `set_locale_from_accept_language` is used (jkobus) + * bug #52928 [Dotenv] Allow environment variables starting with an underscore (xabbuh) + * bug #53243 [Mailer][Postmark] Add missing changelog for webhook support (OskarStark) + * bug #53232 [Notifier] [Smsc] Require login and password (OskarStark) + * bug #53225 [WebProfilerBundle] Fix the design of the compact toolbar button (javiereguiluz) + * bug #53178 [Translation][Crowdin] Use project language mapping (andrii-bodnar) + * bug #53187 [Messenger] Fix using negative delay (J-roen) + * bug #53133 [Validator] Fix using known option names as field names (HypeMC) + * bug #53172 [SecurityBundle] Prevent to login/logout without a request context (symfonyaml) + * bug #53153 [WebProfilerBundle] Fix JS error when evaluating scripts (jderusse) + * bug #52998 [Notifier] [Bridges] Provide EventDispatcher and HttpClient to the transport (rdavaillaud) + * bug #52817 [Serializer] Do not instantiate object if it is not instantiable (maxbaldanza) + * bug #53079 [DoctrineBridge] Add check for lazy object interface (maxbaldanza) + * bug #53115 [Serializer] Fix partial denormalization with missing constructor arguments (HypeMC) + * bug #53125 [Mailer] add the MailPace transport to the UnsupportedSchemeException (xabbuh) + * bug #53081 [Serializer] Keep stack trace for enum value denormalizer error (kylekatarnls) + * bug #53107 [HttpKernel] Don't validate partially denormalized object (HypeMC) + * bug #52891 [HttpKernel] Fix request attribute value ignored with pinned resolvers (HypeMC) + * bug #53057 [HttpKernel] Move ``@internal`` from `AbstractSessionListener` class to its methods and properties (Florian-Merle) + * bug #52990 [TwigBridge] don't use deprecated and internal Twig functions (xabbuh) + * bug #53007 [FrameworkBundle] Fix webhook parser service removal and add notifier parser service removal (alexandre-daubois) + * bug #52996 [Validator] add missing translation (xabbuh) + * bug #52978 [Webhook] [Framework] Added missing XML attribute in config XSD (TimoBakx) + * bug #52584 [WebProfilerBundle] Fix intercept external redirects (HeahDude) + * bug #52964 [ExpressionLanguage] Fix null coalescing propagation (fancyweb) + * bug #52940 [Console] Fix color support check on non-Windows platforms (theofidry) + * bug #52896 [Messenger] Avoid reconnecting active Redis connections. (BusterNeece) + * bug #52923 Avoid incompatibility with symfony/console 7 (jdecool) + * bug #52927 [Dotenv] Properly handle `SYMFONY_DOTENV_VARS` being the empty string (xabbuh) + * bug #52935 [Validator] Missing translations for Slovak (sk) #51954 (Jan Vernarsky) + * bug #52941 [Console] Fix xterm detection (theofidry) + * bug #52795 [FrameworkBundle]  do not overwrite an application's default serialization context (xabbuh) + * bug #52885 [Serializer] fix nullable int cannot be serialized (nikophil) + * bug #52886 [HttpKernel] Catch `TypeError` if the wrong type is used in `BackedEnumValueResolver` (alexandre-daubois) + * bug #52864 [HttpClient][Mailer][Process] always pass microseconds to usleep as integers (xabbuh) + +* 6.3.10 (2023-12-01) + + * bug #52804 [Serializer] Fix support of plain object types denormalization (andersonamuller) + * bug #52845 [Routing] Restore aliases removal in RouteCollection::remove() (fancyweb) + * bug #52846 [PhpUnitBridge]  run composer update for compatibility with PHPUnit versions shipping composer.lock (xabbuh) + * bug #52823 add parameter types in query builder (javiercno) + * bug #52808 [DependencyInjection] Fix dumping containers with null-referenced services (nicolas-grekas) + * bug #52797 [VarExporter] Fix lazy ghost trait when using nullsafe operator (nicolas-grekas) + * bug #52806 [Routing] Fix removing aliases pointing to removed route in `RouteCollection::remove()` (fancyweb) + +* 6.3.9 (2023-11-29) + + * bug #52786 [Serializer] Revert allowed attributes fix (mtarld) + * bug #52780 [DependencyInjection] don't check parameter values if they are not set (xabbuh) + * bug #52762 [VarExporter] Work around php/php-src#12695 for lazy objects, fixing nullsafe-related behavior (nicolas-grekas) + * bug #52759 [VarExporter] Fix serializing objects that implement __sleep() and that are made lazy (nicolas-grekas) + * bug #52767 [Serializer] Fix normalization relying on allowed attributes only (mtarld) + * bug #52727 [String] Fix Inflector for 'icon' (podhy) + * bug #52677 [Translation] [Lokalise] Fix language format on Lokalise Provider (welcoMattic) + * bug #52715 [Cache] fix detecting the database server version (xabbuh) + * bug #52688 [Cache] Add url decoding of password in `RedisTrait` DSN (alexandre-daubois) + * bug #52172 [Serializer] Fix denormalizing empty string into `object|null` parameter (Jeroeny) + * bug #52693 [Messenger] Fix message handlers with multiple `from_transports` (valtzu) + * bug #52684 [PropertyInfo] Fixed promoted property type detection for `PhpStanExtractor` (LastDragon-ru) + * bug #52681 [Serializer] Fix support for DiscriminatorMap in PropertyNormalizer (mtarld) + * bug #52680 [Serializer] Fix access to private properties/getters when using the ``@Ignore`` annotation (mtarld) + * bug #52713 [Serializer] Fix deserialization_path missing using contructor (mtarld) + * bug #52683 [Serializer] Fix constructor deserialization path (mtarld) + * bug #52707 [HttpKernel] Fix logging deprecations to the "php" channel when channel "deprecation" is not defined (nicolas-grekas) + * bug #52589 [Serializer] Fix XML attributes not added on empty node (mtarld) + * bug #52686 [Cache] fix detecting the server version with Doctrine DBAL 4 (xabbuh) + * bug #52629 [Messenger] Fix support for Redis Sentinel using php-redis 6.0.0 (pepeh) + * bug #52459 [Cache][HttpFoundation][Lock] Fix PDO store not creating table + add tests (HypeMC) + * bug #52626 [Serializer] Fix denormalizing date intervals having both weeks and days (oneNevan) + * bug #52578 [Serializer] Fix denormalize constructor arguments (mtarld) + * bug #52526 Add some more non-countable English nouns (paullallier) + * bug #52631 [DomCrawler] Revert "bug #52579 UriResolver support path with colons" (lyrixx) + * bug #52618 [VarExporter] Fix handling mangled property names returned by __sleep() (nicolas-grekas) + * bug #52588 [Messenger] Use extension_loaded call to check if pcntl extension is loaded, as SIGTERM might be set be swoole (Sergii Dolgushev) + * bug #52579 [DomCrawler] UriResolver support path with colons (vdauchy) + * bug #52581 [Messenger] attach all required parameters to query (xabbuh) + +* 6.3.8 (2023-11-10) + + * bug #51666 [RateLimiter] CompoundLimiter was accepting requests even when some limiters already consumed all tokens (10n) + * security #cve-2023-46734 [TwigBridge] Ensure CodeExtension's filters properly escape their input (nicolas-grekas, GromNaN) + * security #cve-2023-46735 [Webhook] Remove user-submitted type from HTTP response (nicolas-grekas) + * security #cve-2023-46733 [Security] Fix possible session fixation when only the *token* changes (RobertMe) + * bug #52514 [FrameworkBundle] Don't reference SYMFONY_IDE env var in non-debug mode (nicolas-grekas) + * bug #52506 [SecurityBundle] wire the secret for Symfony 6.4 compatibility (xabbuh) + * bug #52496 [VarDumper] Accept mixed key on `DsPairStub` (marc-mabe) + * bug #52502 [Config] Prefixing `FileExistenceResource::__toString()` to avoid conflict with `FileResource` (weaverryan) + * bug #52491 [String] Method toByteString conversion using iconv is unreachable (Vincentv92) + * bug #52488 [HttpKernel] Fix PHP deprecation (nicolas-grekas) + * bug #52476 [Messenger] fix compatibility with Doctrine DBAL 4 (xabbuh) + * bug #52474 [HttpFoundation] ensure string type with mbstring func overloading enabled (xabbuh) + * bug #52472 [HttpClient][WebProfilerBundle] Do not generate cURL command when files are uploaded (MatTheCat) + * bug #52457 [Cache][HttpFoundation][Lock] Fix empty username/password for PDO PostgreSQL (HypeMC) + * bug #52443 [Yaml] Fix uid binary parsing (mRoca) + * bug #52429 [HttpClient] Replace `escapeshellarg` to prevent overpassing `ARG_MAX` (alexandre-daubois) + * bug #52442 Disable the "Copy as cURL" button when the debug info are disabled (stof) + * bug #52444 Remove full DSNs from exception messages (nicolas-grekas) + * bug #52428 [HttpKernel] Preventing error 500 when function putenv is disabled (ShaiMagal) + * bug #52408 [Yaml] Fix block scalar array parsing (NickSdot) + * bug #52132 [Console] Fix horizontal table top border is incorrectly rendered (OskarStark) + * bug #52367 [Uid] Fix UuidV7 collisions within the same ms (nicolas-grekas) + * bug #52222 [MonologBridge] Fix support for monolog 3.0 (louismariegaborit) + * 6.3.7 (2023-10-29) * bug #52329 [HttpClient] Psr18Client: parse HTTP Reason Phrase for Response (Hanmac) diff --git a/CHANGELOG-6.4.md b/CHANGELOG-6.4.md index f93f009930604..78e2a5e01dec1 100644 --- a/CHANGELOG-6.4.md +++ b/CHANGELOG-6.4.md @@ -7,6 +7,793 @@ in 6.4 minor versions. To get the diff for a specific change, go to https://github.com/symfony/symfony/commit/XXX where XXX is the change hash To get the diff between two versions, go to https://github.com/symfony/symfony/compare/v6.4.0...v6.4.1 +* 6.4.22 (2025-05-29) + + * bug #60549 [Translation] Add intl-icu fallback for MessageCatalogue metadata (pontus-mp) + * bug #60571 [ErrorHandler] Do not transform file to link if it does not exist (lyrixx) + * bug #60494 [Messenger] fix: Add argument as integer (overexpOG) + * bug #60524 [Notifier] Fix Clicksend transport (BafS) + * bug #60478 [Validator] add missing `$extensions` and `$extensionsMessage` to the `Image` constraint (xabbuh) + * bug #60423 [DependencyInjection] Make `DefinitionErrorExceptionPass` consider `IGNORE_ON_UNINITIALIZED_REFERENCE` and `RUNTIME_EXCEPTION_ON_INVALID_REFERENCE` the same (MatTheCat) + * bug #60421 [VarExporter] Fixed lazy-loading ghost objects generation with property hooks (cheack) + * bug #60266 [Security] Exclude remember_me from default login authenticators (santysisi) + * bug #60400 [Config] Fix generated comment for multiline "info" (GromNaN) + * bug #60260 [Serializer] Prevent `Cannot traverse an already closed generator` error by materializing Traversable input (santysisi) + * bug #60292 [HttpFoundation] Encode path in `X-Accel-Redirect` header (Athorcis) + * bug #60379 [Security] Avoid failing when PersistentRememberMeHandler handles a malformed cookie (Seldaek) + * bug #60373 [FrameworkBundle] Ensure `Email` class exists before using it (Kocal) + * bug #60365 [FrameworkBundle] ensure that all supported e-mail validation modes can be configured (xabbuh) + * bug #60350 [Security][LoginLink] Throw `InvalidLoginLinkException` on invalid parameters (davidszkiba) + * bug #60340 [String] fix EmojiTransliterator return type compatibility with PHP 8.5 (xabbuh) + +* 6.4.21 (2025-05-02) + + * bug #60288 [VarExporter] dump default value for property hooks if present (xabbuh) + * bug #60268 [Contracts] Fix `ServiceSubscriberTrait` for nullable service (StevenRenaux) + * bug #60256 [Mailer][Postmark] drop the `Date` header using the API transport (xabbuh) + * bug #60258 [VarExporter] Fix: Use correct closure call for property-specific logic in $notByRef (Hakayashii, denjas) + * bug #60269 [Notifier] [Discord] Fix value limits (norkunas) + * bug #60248 [Messenger] Revert " Add call to `gc_collect_cycles()` after each message is handled" (jwage) + * bug #60236 [String] Support nexus -> nexuses pluralization (KorvinSzanto) + * bug #60194 [Workflow] Fix dispatch of entered event when the subject is already in this marking (lyrixx) + * bug #60172 [Cache] Fix invalidating on save failures with Array|ApcuAdapter (nicolas-grekas) + * bug #60122 [Cache] ArrayAdapter serialization exception clean $expiries (bastien-wink) + * bug #60167 [Cache] Fix proxying third party PSR-6 cache items (Dmitry Danilson) + * bug #60165 [HttpKernel] Do not ignore enum in controller arguments when it has an `#[Autowire]` attribute (ruudk) + * bug #60168 [Console] Correctly convert `SIGSYS` to its name (cs278) + * bug #60166 [Security] fix(security): fix OIDC user identifier (vincentchalamon) + * bug #60124 [Validator] : fix url validation when punycode is on tld but not on domain (joelwurtz) + * bug #60057 [Mailer] Fix `Trying to access array offset on value of type null` error by adding null checking (khushaalan) + * bug #60094 [DoctrineBridge] Fix support for entities that leverage native lazy objects (nicolas-grekas) + * bug #60094 [DoctrineBridge] Fix support for entities that leverage native lazy objects (nicolas-grekas) + +* 6.4.20 (2025-03-28) + + * bug #60054 [Form] Use duplicate_preferred_choices to set value of ChoiceType (aleho) + * bug #59858 Update `JsDelivrEsmResolver::IMPORT_REGEX` to support dynamic imports (natepage) + * bug #60019 [HttpKernel] Fix `TraceableEventDispatcher` when the `Stopwatch` service has been reset (lyrixx) + * bug #59975 [HttpKernel] Only remove `E_WARNING` from error level during kernel init (fritzmg) + * bug #59988 [FrameworkBundle] Remove redundant `name` attribute from `default_context` (HypeMC) + * bug #59949 [Process] Use a pipe for stderr in pty mode to avoid mixed output between stdout and stderr (joelwurtz) + * bug #59940 [Cache] Fix missing cache data in profiler (dcmbrs) + * bug #59965 [VarExporter] Fix support for hooks and asymmetric visibility (nicolas-grekas) + * bug #59874 [Console] fix progress bar messing output in section when there is an EOL (joelwurtz) + * bug #59888 [PhpUnitBridge] don't trigger "internal" deprecations for PHPUnit Stub objects (xabbuh) + * bug #59830 [Yaml] drop comments while lexing unquoted strings (xabbuh) + * bug #59884 [VarExporter] Fix support for asymmetric visibility (nicolas-grekas) + * bug #59881 [VarExporter] Fix support for abstract properties (nicolas-grekas) + * bug #59841 [Cache] fix cache data collector on late collect (dcmbrs) + +* 6.4.19 (2025-02-26) + + * bug #59198 [Messenger] Filter out non-consumable receivers when registering `ConsumeMessagesCommand` (wazum) + * bug #59781 [Mailer] fix multiple transports default injection (fkropfhamer) + * bug #59836 [Mailer][Postmark] Set CID for attachments when it exists (IssamRaouf) + * bug #59840 Fix PHP warning in GetSetMethodNormalizer when a "set()" method is defined (Pepperoni1337) + * bug #59810 [DependencyInjection] Defer check for circular references instead of skipping them (biozshock) + * bug #59811 [Validator] Synchronize IBAN formats (alexandre-daubois) + * bug #59796 [Mime] use address for body at `PathHeader` (tinect) + * bug #59803 [Semaphore] allow redis cluster/sentinel dsn (smoench) + * bug #59779 [DomCrawler] Bug #43921 Check for null parent nodes in the case of orphaned branches (ttk) + * bug #59776 [WebProfilerBundle] fix rendering notifier message options (xabbuh) + * bug #59769 Enable `JSON_PRESERVE_ZERO_FRACTION` in `jsonRequest` method (raffaelecarelle) + * bug #59774 [TwigBridge] Fix compatibility with Twig 3.21 (alexandre-daubois) + * bug #59761 [VarExporter] Fix lazy objects with hooked properties (nicolas-grekas) + * bug #59763 [HttpClient] Don't send any default content-type when the body is empty (nicolas-grekas) + * bug #59747 [Translation] check empty notes (davidvancl) + * bug #59751 [Cache] Tests for Redis Replication with cache (DemigodCode) + * bug #59752 [BrowserKit] Fix submitting forms with empty file fields (nicolas-grekas) + * bug #59033 [WebProfilerBundle] Fix interception for non conventional redirects (Huluti) + * bug #59713 [DependencyInjection] Do not preload functions (biozshock) + * bug #59723 [DependencyInjection] Fix cloned lazy services not sharing their dependencies when dumped with PhpDumper (pvandommelen) + * bug #59727 [HttpClient] Fix activity tracking leading to negative timeout errors (nicolas-grekas) + * bug #59262 [DependencyInjection] Fix env default processor with scalar node (tBibaut) + * bug #59640 [Security] Return null instead of empty username to fix deprecation notice (phasdev) + * bug #59596 [Mime] use `isRendered` method to ensure we can avoid rendering an email twice (walva) + * bug #59689 [HttpClient] Fix buffering AsyncResponse with no passthru (nicolas-grekas) + * bug #59654 [HttpClient] Fix uploading files > 2GB (nicolas-grekas) + +* 6.4.18 (2025-01-29) + + * bug #58889 [Serializer] Handle default context in Serializer (Valmonzo) + * bug #59631 [HttpClient] Fix processing a NativeResponse after its client has been reset (Jean-Beru) + * bug #59590 [Security] Throw an explicit error when refreshing a token with a null user (alexandre-daubois) + * bug #59625 [FrameworkBundle] Add missing `not-compromised-password` entry in XSD (alexandre-daubois) + * bug #59610 [Mailer] Ensure TransportExceptionInterface populates stream debug data (bytestream) + * bug #59598 [Mime] Fix body validity check in `Email` when using `Message::setBody()` (alexandre-daubois) + * bug #59544 [AssetMapper] Fix CssCompiler matches url in comments (smnandre) + * bug #59575 [DoctrineBridge] Add support for doctrine/persistence 4 (greg0ire) + * bug #59399 [DomCrawler] Make `ChoiceFormField::isDisabled` return `true` for unchecked disabled checkboxes (MatTheCat) + * bug #59581 [Cache] Don't clear system caches on `cache:clear` (nicolas-grekas) + * bug #59579 [FrameworkBundle] Fix patching refs to the tmp warmup dir in files generated by optional cache warmers (nicolas-grekas) + * bug #59525 [HtmlSanitizer] Fix access to undefined keys in UrlSanitizer (Antoine Beyet) + * bug #59538 [VarDumper] fix dumped markup (xabbuh) + * bug #59515 [FrameworkBundle] Fix wiring ConsoleProfilerListener (nicolas-grekas) + * bug #59486 [Validator] Update sr_Cyrl 120:This value is not a valid slug. (kaznovac) + * bug #59403 [FrameworkBundle][HttpFoundation] Reset Request's formats using the service resetter (nicolas-grekas) + * bug #59404 [Mailer] Fix SMTP stream EOF handling on Windows by using feof() (skmedix) + * bug #59390 [VarDumper] Fix blank strings display (MatTheCat) + * bug #59446 [Routing] Fix configuring a single route's hosts (MatTheCat) + * bug #58901 [HttpClient] Ignore RuntimeExceptions thrown when rewinding the PSR-7 created in HttplugWaitLoop::createPsr7Response (KurtThiemann) + * bug #59046 [HttpClient] Fix Undefined array key `connection` (PhilETaylor) + * bug #59055 [HttpFoundation] Fixed `IpUtils::anonymize` exception when using IPv6 link-local addresses with RFC4007 scoping (jbtronics) + * bug #59256 [Mailer] Fix Sendmail memory leak (rch7) + * bug #59375 [RemoteEvent][Webhook] fix SendgridPayloadConverter category support (ericabouaf) + * bug #59367 [PropertyInfo] Make sure that SerializerExtractor returns null for invalid class metadata (wuchen90) + * bug #59376 [RemoteEvent][Webhook] Fix `SendgridRequestParser` and `SendgridPayloadConverter` (ericabouaf) + * bug #59381 [Yaml] fix inline notation with inline comment (alexpott) + * bug #59352 [Messenger] Fix `TransportMessageIdStamp` not always added (HypeMC) + * bug #59185 [DoctrineBridge] Fix compatibility to Doctrine persistence 2.5 in Doctrine Bridge 6.4 to avoid Projects stuck on 6.3 (alexander-schranz) + * bug #59245 [PropertyInfo] Fix add missing composer conflict (mtarld) + * bug #59292 [WebProfilerBundle] Fix event delegation on links inside toggles (MatTheCat) + * bug #59362 [Doctrine][Messenger] Prevents multiple TransportMessageIdStamp being stored in envelope (rtreffler) + * bug #59323 [Serializer] Fix exception thrown by `YamlEncoder` (VincentLanglet) + * bug #59293 [AssetMapper] Fix JavaScript compiler creates self-referencing imports (smnandre) + * bug #59349 [Yaml] reject inline notations followed by invalid content (xabbuh) + * bug #59363 [VarDumper] Fix displaying closure's "this" from anonymous classes (nicolas-grekas) + * bug #59364 [ErrorHandler] Don't trigger "internal" deprecations for anonymous LazyClosure instances (nicolas-grekas) + * bug #59221 [PropertyAccess] Fix compatibility with PHP 8.4 asymmetric visibility (Florian-Merle) + * bug #59357 [HttpKernel] Don't override existing `LoggerInterface` autowiring alias in `LoggerPass` (nicolas-grekas) + * bug #59347 [Security] Fix triggering session tracking from ContextListener (nicolas-grekas) + * bug #59188 [HttpClient] Fix `reset()` not called on decorated clients (HypeMC) + * bug #59343 [Security] Adjust parameter order in exception message (Link1515) + * bug #59312 [Yaml] Fix parsing of unquoted strings in Parser::lexUnquotedString() to ignore spaces (Link1515) + * bug #59334 [ErrorHandler] [A11y] Simple proposal for color updates on error stack traces against colorblindness (DocFX) + +* 6.4.17 (2024-12-31) + + * bug #59304 [PropertyInfo] Remove ``@internal`` from `PropertyReadInfo` and `PropertyWriteInfo` (Dario Guarracino) + * bug #59318 [Finder] Fix using `==` as default operator in `DateComparator` (MatTheCat) + * bug #59321 [HtmlSanitizer] reject URLs containing whitespaces (xabbuh) + * bug #59250 [HttpClient] Fix a typo in NoPrivateNetworkHttpClient (Jontsa) + * bug #59103 [Messenger] ensure exception on rollback does not hide previous exception (nikophil) + * bug #59226 [FrameworkBundle] require the writer to implement getFormats() in the translation:extract (xabbuh) + * bug #59213 [FrameworkBundle] don't require fake notifier transports to be installed as non-dev dependencies (xabbuh) + * bug #59160 [BeanstalkMessenger] Round delay to an integer to avoid deprecation warning (plantas) + * bug #59012 [PropertyInfo] Fix interface handling in `PhpStanTypeHelper` (janedbal) + * bug #59134 [HttpKernel] Denormalize request data using the csv format when using "#[MapQueryString]" or "#[MapRequestPayload]" (except for content data) (ovidiuenache) + * bug #59140 [WebProfilerBundle] fix: white-space in highlighted code (chr-hertel) + * bug #59124 [FrameworkBundle] fix: notifier push channel bus abstract arg (raphael-geffroy) + * bug #59069 [Console] Fix division by 0 error (Rindula) + * bug #59070 [PropertyInfo] evaluate access flags for properties with asymmetric visibility (xabbuh) + * bug #59062 [HttpClient] Always set CURLOPT_CUSTOMREQUEST to the correct HTTP method in CurlHttpClient (KurtThiemann) + * bug #59023 [HttpClient] Fix streaming and redirecting with NoPrivateNetworkHttpClient (nicolas-grekas) + +* 6.4.16 (2024-11-27) + + * bug #59013 [HttpClient] Fix checking for private IPs before connecting (nicolas-grekas) + * bug #58562 [HttpClient] Close gracefull when the server closes the connection abruptly (discordier) + * bug #59007 [Dotenv] read runtime config from composer.json in debug dotenv command (xabbuh) + * bug #58963 [PropertyInfo] Fix write visibility for Asymmetric Visibility and Virtual Properties (xabbuh, pan93412) + * bug #58983 [Translation] [Bridge][Lokalise] Fix empty keys array in PUT, DELETE requests causing Lokalise API error (DominicLuidold) + * bug #58956 [DoctrineBridge] Fix `Connection::createSchemaManager()` for Doctrine DBAL v2 (neodevcode) + * bug #58959 [PropertyInfo] consider write property visibility to decide whether a property is writable (xabbuh) + * bug #58964 [TwigBridge] do not add child nodes to EmptyNode instances (xabbuh) + * bug #58952 [Cache] silence warnings issued by Redis Sentinel on connection issues (xabbuh) + * bug #58859 [AssetMapper] ignore missing directory in `isVendor()` (alexislefebvre) + * bug #58917 [OptionsResolver] Allow Union/Intersection Types in Resolved Closures (zanbaldwin) + * bug #58822 [DependencyInjection] Fix checking for interfaces in ContainerBuilder::getReflectionClass() (donquixote) + * bug #58865 Dynamically fix compatibility with doctrine/data-fixtures v2 (greg0ire) + * bug #58921 [HttpKernel] Ensure `HttpCache::getTraceKey()` does not throw exception (lyrixx) + * bug #58908 [DoctrineBridge] don't call `EntityManager::initializeObject()` with scalar values (xabbuh) + * bug #58938 [Cache] make RelayProxyTrait compatible with relay extension 0.9.0 (xabbuh) + * bug #58924 [HttpClient] Fix empty hosts in option "resolve" (nicolas-grekas) + * bug #58915 [HttpClient] Fix option "resolve" with IPv6 addresses (nicolas-grekas) + * bug #58919 [WebProfilerBundle] Twig deprecations (mazodude) + * bug #58914 [HttpClient] Fix option "bindto" with IPv6 addresses (nicolas-grekas) + * bug #58875 [HttpClient] Removed body size limit (Carl Julian Sauter) + * bug #58862 [Notifier] Fix GoIpTransport (nicolas-grekas) + * bug #58860 [HttpClient] Fix catching some invalid Location headers (nicolas-grekas) + * bug #58836 Work around `parse_url()` bug (bis) (nicolas-grekas) + * bug #58818 [Messenger] silence PHP warnings issued by `Redis::connect()` (xabbuh) + * bug #58828 [PhpUnitBridge] fix dumping tests to skip with data providers (xabbuh) + * bug #58842 [Routing] Fix: lost priority when defining hosts in configuration (BeBlood) + * bug #58850 [HttpClient] fix PHP 7.2 compatibility (xabbuh) + +* 6.4.15 (2024-11-13) + + * security #cve-2024-50342 [HttpClient] Resolve hostnames in NoPrivateNetworkHttpClient (nicolas-grekas) + * security #cve-2024-51996 [Security] Check owner of persisted remember-me cookie (jderusse) + * bug #58799 [String] Fix some spellings in `EnglishInflector` (alexandre-daubois) + * bug #56868 [Serializer] fixed object normalizer for a class with `cancel` method (er1z) + * bug #58601 [RateLimiter] Fix bucket size reduced when previously created with bigger size (Orkin) + * bug #58659 [AssetMapper] Fix `JavaScriptImportPathCompiler` regex for non-latin characters (GregRbs92) + * bug #58658 [Twitter][Notifier] Fix post INIT upload (matyo91) + * bug #58763 [Messenger][RateLimiter] fix additional message handled when using a rate limiter (Jean-Beru) + * bug #58791 [RateLimiter] handle error results of DateTime::modify() (xabbuh) + * bug #58800 [PropertyInfo] fix support for phpstan/phpdoc-parser 2 (xabbuh) + +* 6.4.14 (2024-11-06) + + * bug #58772 [DoctrineBridge] Backport detection fix of Xml/Yaml driver in DoctrineExtension (MatTheCat) + * security #cve-2024-51736 [Process] Use PATH before CD to load the shell on Windows (nicolas-grekas) + * security #cve-2024-50342 [HttpClient] Filter private IPs before connecting when Host == IP (nicolas-grekas) + * security #cve-2024-50345 [HttpFoundation] Reject URIs that contain invalid characters (nicolas-grekas) + * security #cve-2024-50340 [Runtime] Do not read from argv on non-CLI SAPIs (wouterj) + * bug #58765 [VarDumper] fix detecting anonymous exception classes on Windows and PHP 7 (xabbuh) + * bug #58757 [RateLimiter] Fix DateInterval normalization (danydev) + * bug #58754 [Security] Store original token in token storage when implicitly exiting impersonation (wouterj) + * bug #58753 [Cache] Fix clear() when using Predis (nicolas-grekas) + * bug #58713 [Config] Handle Phar absolute path in `FileLocator` (alexandre-daubois) + * bug #58728 [WebProfilerBundle] Re-add missing Profiler shortcuts on Profiler homepage (welcoMattic) + * bug #58739 [WebProfilerBoundle] form data collector check passed and resolved options are defined (vltrof) + * bug #58752 [Process] Fix escaping /X arguments on Windows (nicolas-grekas) + * bug #58735 [Process] Return built-in cmd.exe commands directly in ExecutableFinder (Seldaek) + * bug #58723 [Process] Properly deal with not-found executables on Windows (nicolas-grekas) + * bug #58711 [Process] Fix handling empty path found in the PATH env var with ExecutableFinder (nicolas-grekas) + * bug #58704 [HttpClient] fix for HttpClientDataCollector fails if proc_open is disabled via php.ini (ZaneCEO) + +* 6.4.13 (2024-10-27) + + * bug #58669 [Cache] Revert "Initialize RedisAdapter cursor to 0" (nicolas-grekas) + * bug #58649 [TwigBridge] ensure compatibility with Twig 3.15 (xabbuh) + * bug #58661 [Cache] Initialize RedisAdapter cursor to 0 (thomas-hiron) + * bug #58593 [Mime] fix encoding issue with UTF-8 addresses containing doubles spaces (0xb4lint) + * bug #58636 [Notifier] Improve Telegrams markdown escaping (codedge) + * bug #58615 [Validator] [Choice] Fix callback option if not array returned (symfonyaml) + * bug #58618 [DependencyInjection] Fix linting factories implemented via __callStatic (KevinVanSonsbeek) + * bug #58619 [HttpFoundation][Lock] Ensure compatibility with ext-mongodb v2 (GromNaN) + * bug #58627 Minor fixes around `parse_url()` checks (nicolas-grekas) + * bug #58617 [DependencyInjection] Fix replacing abstract arguments with bindings (nicolas-grekas) + * bug #58623 [Intl] do not access typed property before initialization (xabbuh) + * bug #58613 Symfony 5.4 LTS will get security fixes until Feb 2029 thanks to Ibexa' sponsoring (nicolas-grekas) + * bug #58523 [DoctrineBridge] fix: DoctrineTokenProvider not oracle compatible (jjjb03) + * bug #58569 [Mailer][MailJet] Fix parameters for TrackClicks and TrackOpens (torohill) + * bug #58557 [Doctrine][Messenger] Oracle sequences are suffixed with `_seq` (clem-rwan) + * bug #58525 [Notifier] silence warnings triggered when malformed XML is parsed (xabbuh) + * bug #58550 [Scheduler] silence PHP warning when an invalid date interval format string is used (xabbuh) + * bug #58492 [MonologBridge] Fix PHP deprecation with `preg_match()` (simoheinonen) + * bug #58449 [Form] Support intl.use_exceptions/error_level in NumberToLocalizedStringTransformer (bram123) + * bug #54566 [Doctrine][Messenger] Use common sequence name to get id from Oracle (rjd22) + * bug #58459 [FrameworkBundle] Fix displayed stack trace when session is used on stateless routes (nicolas-grekas) + * bug #58255 [Serializer] Fix `ObjectNormalizer` gives warnings on normalizing with public static property (André Laugks) + * bug #58306 [Serializer] Collect denormalization errors for variadic params (mtarld) + * bug #58376 [HttpKernel] Correctly merge `max-age`/`s-maxage` and `Expires` headers (aschempp) + * bug #58299 [DependencyInjection] Fix `XmlFileLoader` not respecting when env for services (Bradley Zeggelaar) + * bug #58332 [Console] Suppress `proc_open` errors within `Terminal::readFromProcess` (fritzmg) + * bug #58343 [HttpClient] Add `crypto_method` to scoped client options (HypeMC) + * bug #58395 [TwigBridge] Fixed a parameterized choice label translation (7-zete-7) + * bug #58409 [Translation] Fix extracting of message from ->trans() method with named params (tugmaks) + * bug #58404 [TwigBridge] Remove usage of `Node()` instantiations (fabpot) + * bug #58377 [Emoji] Update data to support emoji 16 (lyrixx) + * bug #58393 [Dotenv] Default value can be empty (HypeMC) + * bug #58400 [Mailer] Fix exception message on invalid event in `SendgridPayloadConverter` (alexandre-daubois) + * bug #58372 Tweak error/exception handler registration (nicolas-grekas) + * bug #58365 [Cache] silence warnings issued by Redis Sentinel on connection issues (xabbuh) + +* 6.4.12 (2024-09-21) + + * bug #58339 [Notifier] allow the Novu bridge to be used with symfony/notifier 7.x (xabbuh) + * bug #58327 [FrameworkBundle] Do not access the container when the kernel is shut down (jderusse) + * bug #58316 [Form] Don't call the constructor of LogicalOr (derrabus) + * bug #58290 [FrameworkBundle] fix XSD to allow to configure locks without resources (xabbuh) + * bug #58291 [Process] Fix finding executables independently of open_basedir (BlackbitDevs) + * bug #58279 [Yaml] parse empty sequence elements as null (xabbuh) + * bug #58289 [HttpKernel] Skip logging uncaught exceptions in `ErrorHandler`, assume `$kernel->terminateWithException()` will do it (nicolas-grekas) + * bug #58185 [Filesystem] make sure temp files can be cleaned up on Windows (xabbuh) + * bug #58226 [Serializer] Fix for method named `get()` (mihai-stancu) + * bug #58242 [Notifier][TurboSMS] Process partial accepted response from transport (ZhukV) + * bug #58260 [Cache] Fix RedisSentinel param types (Paweł Stasicki) + * bug #58278 [HttpClient] Fix setting `CURLMOPT_MAXCONNECTS` (HypeMC) + * bug #58274 [Dotenv] throw a meaningful exception when parsing dotenv files with BOM (xabbuh) + * bug #58240 [FrameworkBundle] Fix service reset between tests (HypeMC) + * bug #58266 [HttpKernel] pass CSV escape characters explicitly (xabbuh) + * bug #58181 [HttpFoundation] Update links for `X-Accel-Redirect` and fail properly when `X-Accel-Mapping` is missing (nicolas-grekas) + * bug #58195 [Process] Fix the removal of host-specific configuration when managing the ini settings in `PhpSubprocess` (M-arcus) + * bug #58218 Work around `parse_url()` bug (nicolas-grekas) + * bug #58207 [TwigBridge] Avoid calling deprecated mergeGlobals() (derrabus) + * bug #58198 [TwigBundle] Add support for resetting globals between HTTP requests (fabpot) + * bug #58169 [Cache] Fix compatibility with Redis 6.1.0 pre-releases (cedric-anne) + * bug #58143 [Ldap] Fix extension deprecation (alexandre-daubois) + +* 6.4.11 (2024-08-30) + + * bug #58110 [PropertyAccess] Fix handling property names with a `.` (alexandre-daubois) + * bug #58127 [Validator] synchronize IBAN formats (xabbuh) + * bug #58112 fix Twig 3.12 compatibility (xabbuh) + * bug #58078 [TwigBridge] Fix Twig deprecation notice (yceruto) + * bug #58000 [DependencyInjection] Fix issue between decorator and service locator index (lyrixx) + * bug #58044 [HttpClient] Do not overwrite the host to request when using option "resolve" (xabbuh) + * bug #58046 [AssetMapper] Fix JsDeliver import regexp (smnandre) + * bug #57298 [DependencyInjection] Fix handling of repeated `#[Autoconfigure]` attributes (alexandre-daubois) + * bug #57493 [SecurityBundle] Make security schema deterministic (MatTheCat) + * bug #58025 [Mailer] [Brevo] Support the `unique_proxy_open` event (richardhj) + * bug #58015 [HttpKernel] ESI fragment content may be missing in conditional requests (mpdude) + * bug #58017 [SecurityBundle] Revert adding `_stateless` attribute to the request when firewall is stateless and the attribute is not already set (MatTheCat) + * bug #58020 [TwigBridge] fix compatibility with Twig 3.12 and 4.0 (xabbuh) + * bug #58002 [Security] Revert stateless check for ContextListener (VincentLanglet) + * bug #58010 [PsrHttpMessageBridge] Fix conversion of partitioned cookies in the PSR-7 bridge (stof) + * bug #57853 [Console] Fix side-effects from running bash completions (Seldaek) + * bug #57997 [Console][PhpUnitBridge][VarDumper] Fix handling NO_COLOR env var (nicolas-grekas) + * bug #57944 [DoctrineBridge] Fix the `LockStoreSchemaListener` (MatTheCat) + * bug #57984 [Validator] Add `D` regex modifier in relevant validators (alexandre-daubois) + * bug #57981 [HttpClient] reject malformed URLs with a meaningful exception (xabbuh) + * bug #57968 [Yaml] :bug: throw ParseException on invalid date (homersimpsons) + * bug #57925 [Validator] reset the validation context after validating nested constraints (xabbuh) + * bug #57920 [Form] Fix handling empty data in ValueToDuplicatesTransformer (xabbuh) + * bug #57917 [HttpKernel] [WebProfileBundle] Fix Routing panel for URLs with a colon (akeylimepie) + * bug #57885 [Cache] fix compatibility with redis extension 6.0.3+ (xabbuh) + * bug #57861 [Form] NumberType: Fix parsing of numbers in exponential notation with negative exponent (jbtronics) + * bug #57921 [Finder] do not duplicate directory separators (xabbuh) + * bug #57875 [String] Fixed Quorum plural, and Quora singular in EnglishInflector (Dean151) + * bug #57895 [Finder] do not duplicate directory separators (xabbuh) + * bug #57905 [Validator] allow more unicode characters in URL paths (xabbuh) + * bug #57899 [String] [EnglishInflector] Fix words ending with `le`, e.g., `articles` (aleho) + * bug #57896 [Mime] Fix `RawMessage` constructor argument type (alexandre-daubois) + * bug #57887 [Uid] Ensure UuidV1 is created in lowercase (smnandre) + * bug #57870 [HttpClient] Disable HTTP/2 PUSH by default when using curl (nicolas-grekas) + * bug #57625 [DoctrineBridge] Make `EntityValueResolver` return `null` if a composite ID value is `null` (MatTheCat) + +* 6.4.10 (2024-07-26) + + * bug #57803 [FrameworkBundle] move adding detailed JSON error messages to the validate phase (xabbuh) + * bug #57815 [Console][PhpUnitBridge][VarDumper] Fix `NO_COLOR` empty value handling (alexandre-daubois) + * bug #57828 [Translation] Fix CSV escape char in `CsvFileLoader` on PHP >= 7.4 (alexandre-daubois) + * bug #57812 [Validator] treat uninitialized properties referenced by property paths as null (xabbuh) + * bug #57816 [DoctrineBridge] fix messenger bus dispatch inside an active transaction (IndraGunawan) + * bug #57799 [ErrorHandler][VarDumper] Remove PHP 8.4 deprecations (alexandre-daubois) + * bug #57772 [WebProfilerBundle] Add word wrap in tables in dialog to see all the text in workflow listeners dialog (SpartakusMd) + * bug #57802 [PropertyInfo] Fix nullable value returned from extractFromMutator on CollectionType (benjilebon) + * bug #57832 [DependencyInjection] Do not try to load default method name on interface (lyrixx) + * bug #57748 [SecurityBundle] use firewall-specific user checkers when manually logging in users (xabbuh) + * bug #57753 [ErrorHandler] restrict the maximum length of the X-Debug-Exception header (xabbuh) + * bug #57674 [Cache] Improve `dbindex` DSN parameter parsing (constantable) + * bug #57679 [WebProfilerBundle] Change incorrect check for the `stateless` request attribute (themasch) + * bug #57663 [Cache] use copy() instead of rename() on Windows (xabbuh) + * bug #57617 [PropertyInfo] Handle collection in PhpStan same as PhpDoc (mtarld) + * bug #54057 [Messenger] Passing actual `Envelope` to `WorkerMessageRetriedEvent` (daffoxdev) + * bug #57645 [Routing] Discard in-memory cache of routes when writing the file-based cache (mpdude) + * bug #57621 [Mailer]  force HTTP 1.1 for Mailgun API requests (xabbuh) + * bug #57616 [String] Revert "Fixed u()->snake(), b()->snake() and s()->snake() methods" (nicolas-grekas) + * bug #57593 [SecurityBundle] Compare paths after realpath() has been applied to both (xabbuh) + * bug #57594 [String] Normalize underscores in snake() (xabbuh) + * bug #57585 [HttpFoundation] Fix MockArraySessionStorage to generate more conform ids (Seldaek) + * bug #57589 [FrameworkBundle] fix AssetMapper usage without assets enabled (xabbuh) + +* 6.4.9 (2024-06-28) + + * bug #57553 [HttpKernel] Enable optional cache-warmers when cache-dir != build-dir (nicolas-grekas) + * bug #57497 [String] Fixed u()->snake(), b()->snake() and s()->snake() methods (arczinosek) + * bug #57574 [Filesystem] Fix Filesystem::remove() on Windows (nicolas-grekas) + * bug #57572 [DoctrineBridge] Fix compat with DI >= 6.4 (nicolas-grekas) + * bug #57538 [String] Add `alias` case to `EnglishInflector` (alexandre-daubois) + * bug #57533 [FrameworkBundle] Throw runtime exception when trying to use asset-mapper while http-client is disabled (nicolas-grekas) + * bug #57520 [SecurityBundle] Remove unused memory users’ `name` attribute from the XSD (MatTheCat) + * feature #57557 Ibexa is sponsoring Symfony 5.4, thanks to them! \o/ (nicolas-grekas) + * bug #57569 [HttpClient][Mailer] Revert "Let curl handle transfer encoding", use HTTP/1.1 for Mailgun (nicolas-grekas) + * bug #57499 [Mailer] Add additional headers in Scaleway bridge (MrMicky-FR) + * bug #57460 [VarExporter] fix contravariance problem with __unserialize() in lazy proxy (nikophil) + * bug #57397 [VarDumper] Fix FFI caster test (alexandre-daubois) + * bug #57453 [HttpClient] Fix parsing SSE (fancyweb) + * bug #57467 [SecurityBundle] Add `provider` XML attribute to the authenticators it’s missing from (MatTheCat) + * bug #57384 [Notifier] Fix thread key in GoogleChat bridge (romain-jacquart) + * bug #57372 [HttpKernel][Security] Fix accessing session for stateless request (VincentLanglet) + * bug #57112 [Messenger] Handle `AMQPConnectionException` when publishing a message (jwage) + * bug #57341 [Serializer] properly handle invalid data for false/true types (xabbuh) + * bug #57187 [Serializer] Fix `ObjectNormalizer` with property path (HypeMC) + * bug #57355 [ErrorHandler] Fix rendered exception code highlighting on PHP 8.3 (tscni) + * bug #57310 [DependencyInjection] Fix ternary in `AutowireCallable` attribute (alamirault) + * bug #57273 [FrameworkBundle] Fix setting default context for certain normalizers (HypeMC) + * bug #57395 [Notifier]  send the recipient phone number as an array (xabbuh) + * bug #52699 [Serializer] [PropertyAccessor] Ignore non-collection interface generics (mtarld) + * bug #54634 [String] Fix #54611 pluralization of -on ending words + singularization of -a ending foreign words (Geordie, DesLynx) + * bug #57213 [Validator] [UniqueValidator] Use correct variable as parameter in (custom) error message (seho-nl, Sebastien Hoek) + * bug #54920 [Messenger] Comply with Amazon SQS requirements for message body (VincentLanglet) + * bug #57321 [AssetMapper] fix npm version constraint conversion (Jean-Beru) + * bug #57110 [PhpUnitBridge] Fix error handler triggered outside of tests (HypeMC) + * bug #57297 [FrameworkBundle] not registered definitions must not be modified (xabbuh) + * bug #57234 [String] Fix Inflector for 'hardware' (podhy) + * bug #57224 [Mime] Use streams instead of loading raw message generator into memory (bytestream) + +* 6.4.8 (2024-06-02) + + * bug #57284 [Mime] Fix TextPart using an unknown File (fabpot) + * bug #57282 [Scheduler] Throw an exception when no dispatcher has been passed to a Schedule (fabpot) + * bug #57275 Fix autoload configs to avoid warnings when building optimized autoloaders (Seldaek) + * bug #54572 [Mailer] Fix sendmail transport failure handling and interactive mode (bobvandevijver) + * bug #57228 [Mime] fix PHP 7 compatibility (xabbuh) + * bug #57065 [Mime] Fixed `Mime\Message::ensureValidity()` when a required header is set, but has an empty body (rhertogh) + * bug #57109 [Notifier] keep boolean options when their value is false (xabbuh) + * bug #54971 [Serializer] Cache readability/writability computation (mtarld) + * bug #56488 [VarExporter] Fix exporting default values involving global constants (kylekatarnls) + * bug #49186 [Serializer] Improve exception message in UnwrappingDenormalizer (andersonamuller) + * bug #54694 [PropertyInfo] Update DoctrineExtractor for new DBAL 4 BIGINT type (llupa) + * bug #54913 [Serializer] Fix CurrentType for missing property (ElisDN) + * bug #54797 [PhpUnitBridge] Fix `DeprecationErrorHandler` with PhpUnit 10 (HypeMC) + * bug #54878 [Filesystem] Fix dumpFile `stat failed` error hitting custom handler (acoulton) + * bug #54924 [Validator] IBAN Check digits should always between 2 and 98 (karstennilsen) + * bug #54919 [ErrorHandler] Do not call xdebug_get_function_stack() with xdebug >= 3.0 when not in develop mode (fmata) + * bug #54910 [HttpFoundation]  filter out empty HTTP header parts (xabbuh) + * bug #54888 [String] Fix folded in compat mode (smnandre) + * bug #54863 [Process] Return `false` when `open_basedir` prevents access to `/dev/tty` (mjauvin) + * bug #54860 [HttpClient] Revert fixing curl default options (alexandre-daubois) + * bug #54850 [VarExporter] fix `ProxyHelper::generateLazyProxy()` when a method returns null (nikophil) + * bug #54842 [Messenger] Don't drop stamps when message validation fails (valtzu) + * bug #54838 [WebProfilerBundle] Fix assignment to constant variable (HypeMC) + * bug #54837 [Mailer] [Sendgrid] Use `DataPart::getContentId()` when `DataPart::setContentId()` is used (SherinBloemendaal) + * bug #54839 Fix exception thrown during `LDAP_MODIFY_BATCH_REMOVE_ALL` batch operations (phasdev) + * bug #54834 [Validator] Check `Locale` class existence before using it (alexandre-daubois) + * bug #54830 [HttpClient] Fix cURL default options for PHP 8.4 (alexandre-daubois) + * bug #54828 [Serializer] Fix `GetSetMethodNormalizer` not working with setters with optional args (HypeMC) + * bug #54816 [Cache] Fix support for predis/predis:^2.0 (mfettig) + * bug #54804 [Serializer] separate the property info and write info extractors (xabbuh) + * bug #54800 [WebProfilerBundle] fix compatibility with Twig 3.10 (xabbuh) + * bug #54794 [Strings][EnglishInflector] Fix incorrect pluralisation of 'Album' (timporter) + * bug #54714 [Serializer] convert empty CSV header names into numeric keys (xabbuh) + * bug #54775 [Messenger] accept AbstractAsset instances when filtering schemas (xabbuh) + * bug #54758 [Validator] handle edge cases when constructing constraints with named arguments (xabbuh) + * bug #54759 [Filesystem] better distinguish URL schemes and Windows drive letters (xabbuh) + * bug #54791 [FrameworkBundle] move wiring of the property info extractor to the ObjectNormalizer (xabbuh) + * bug #54760 [Validator] handle union and intersection types for cascaded validations (xabbuh) + * bug #54776 [Cache] fix: remove unwanted cast to int (Arend Hummeling) + * bug #54700 [Dotenv] show overridden vars too when running debug:dotenv (HMRDevil) + +* 6.4.7 (2024-04-29) + + * bug #54699 [DoctrineBridge] Update AbstractSchemaListener to adjust more database params (ywisax) + * bug #54691 [Finder] Also consider .git inside the basedir of in() directory (nickvergessen) + * bug #54724 [AssetMapper] Check asset/vendor directory is writable (smnandre) + * bug #54750 [Validator] detect wrong usages of minMessage/maxMessage in options (xabbuh) + * bug #54751 [Validator]  detect wrong e-mail validation modes (xabbuh) + * bug #54723 [Form] read form values using the chain data accessor (xabbuh) + * bug #54706 [Yaml] call substr() with integer offsets (xabbuh) + * bug #54675 [PropertyInfo] Fix PHPStan properties type in trait (mtarld) + * bug #54673 [Messenger] explicitly cast boolean SSL stream options (xabbuh) + * bug #54665 Add test for AccessTokenHeaderRegex and adjust regex (Spomky) + * bug #54635 [Serializer] Revert "Fix object normalizer when properties has the same name as their accessor" - it was a BC Break (NeilPeyssard) + * bug #54625 [Intl] Remove resources data from classmap generation (shyim) + * bug #54598 [TwigBridge]  implement NodeVisitorInterface instead of extending AbstractNodeVisitor (xabbuh) + * bug #54072 [HttpKernel] Fix datacollector caster for reference object property (ebuildy) + * bug #54395 [Serializer] Fixing PHP warning in the ObjectNormalizer with MaxDepth enabled (jaydiablo) + * bug #54564 [Translation] Skip state=needs-translation entries only when source == target (nicolas-grekas) + * bug #54579 [Cache] Always select database for persistent redis connections (uncaught) + * bug #54059 [Security] Validate that CSRF token in form login is string similar to username/password (glaubinix) + * bug #54530 [Clock] initialize the current time with midnight before modifying the date (xabbuh) + * bug #54547 [HttpKernel] Force non lazy controller services (smnandre) + * bug #54517 [HttpClient] Let curl handle transfer encoding (michaelhue) + * bug #52917 [Serializer] Fix unexpected allowed attributes (mtarld) + * bug #54063 [FrameworkBundle] Fix registration of the bundle path to translation (FlyingDR) + * bug #54392 [Messenger] Make Doctrine connection ignore unrelated tables on setup (MatTheCat) + * bug #54513 [HtmlSanitizer] Ignore Processing Instructions (smnandre) + * bug #54506 [HttpFoundation] Set content-type header in RedirectResponse (smnandre) + * bug #52698 [Serializer] Fix XML scalar to object denormalization (mtarld) + * bug #54485 [Serializer] Ignore when using #[Ignore] on a non-accessor (nicolas-grekas) + * bug #54105 [Messenger] Improve deadlock handling on `ack()` and `reject()` (jwage) + * bug #54242 [HttpClient] [EventSourceHttpClient] Fix consuming SSEs with \r\n separator (fancyweb) + * bug #54487 [Validator] Accept `Stringable` in `ExecutionContext::build/addViolation()` (alexandre-daubois) + * bug #54456 [DomCrawler] Encode html entities only if nessecary (ausi) + * bug #54484 [Serializer] reset backed_enum priority, and re-prioritise translatable (GwendolenLynch) + * bug #54471 [Filesystem] Strengthen the check of file permissions in `dumpFile` (alexandre-daubois) + * bug #54403 [FrameworkBundle] [Command] Fix #54402: Suppress PHP warning when is_readable() tries to access dirs outside of open_basedir restrictions (Jeldrik Geraedts) + * bug #54440 [Console] return null when message with name is not set (xabbuh) + * bug #54468 [Translation] Fix LocaleSwitcher throws when intl not loaded (smnandre) + +* 6.4.6 (2024-04-03) + + * bug #54400 [HttpClient] stop all server processes after tests have run (xabbuh) + * bug #54435 [Console] respect multi-byte characters when rendering vertical-style tables (xabbuh) + * bug #54419 Fix TypeError on ProgressBar (Fan2Shrek) + * bug #54425 [TwigBridge] Remove whitespaces from block form_help output (rosier) + * bug #53969 [Mailer] include message id provided by the MTA when dispatching the `SentMessageEvent` (xabbuh) + * bug #54315 [Serializer] Fixed BackedEnumNormalizer priority for translatable enum (IndraGunawan) + * bug #54372 [Config] Fix `YamlReferenceDumper` handling of array examples (MatTheCat) + * bug #54362 [Filesystem] preserve the file modification time when mirroring directories (xabbuh) + * bug #54121 [Messenger] Catch TableNotFoundException in MySQL delete (acbramley) + * bug #54271 [DoctrineBridge] Fix deprecation warning with ORM 3 when guessing field lengths (eltharin) + * bug #54306 Throw TransformationFailedException when there is a null bytes injection (sormes) + * bug #54148 [Serializer] Fix object normalizer when properties has the same name as their accessor (NeilPeyssard) + * bug #54305 [Cache][Lock] Identify missing table in pgsql correctly and address failing integration tests (arifszn) + * bug #54199 [Mailer] [Brevo] Check that tags is present in payload before calling setTags (palgalik) + * bug #54292 [FrameworkBundle] Fix mailer config with XML (lyrixx) + * bug #54298 [Filesystem] Fix str_contains deprecation (NeilPeyssard) + * bug #54248 [Security] Correctly initialize the voter property (aschempp) + * bug #54273 [DependencyInjection] fix XmlDumper when a tag contains also a 'name' property (lyrixx) + * bug #54191 [Validator] add missing invalid extension error entry (xabbuh) + * bug #54194 [PropertyAccess] Fix checking for missing properties (nicolas-grekas) + * bug #54201 [Lock] Check the correct SQLSTATE error code for MySQL (edomato) + * bug #54252 [Lock] compatiblity with redis cluster 7 (bastnic) + * bug #54124 [Messenger] trigger retry logic when message is a redelivery (nikophil) + * bug #54254 [HttpKernel] Fix creating `ReflectionMethod` with only one argument (alexandre-daubois) + * bug #54219 [Validator] Allow BICs’ first four characters to be digits (MatTheCat) + * bug #54239 [Mailer] Fix sendmail transport not handling failure (aboks) + * bug #54207 [HttpClient] Lazily initialize CurlClientState (arjenm) + * bug #53865 [Workflow]Fix Marking when it must contains more than one tokens (lyrixx) + * bug #54137 [Validator] UniqueValidator - normalize before reducing keys (Brajk19) + * bug #54187 [FrameworkBundle] Fix PHP 8.4 deprecation on `ReflectionMethod` (alexandre-daubois) + * bug #54167 [Messenger] [Amqp] Handle AMQPConnectionException when publishing a message. (jwage) + * bug #54146 [HttpClient] Preserve float in JsonMockResponse (Jibbarth) + +* 6.4.5 (2024-03-04) + + * bug #54113 [AssetMapper] Throw exception in Javascript compiler when PCRE error (smnandre) + * bug #54129 [Clock] Add attributes to support PHPUnit 10 + 11 (ruudk) + * bug #54079 [AssetMapper] Fix `JavaScriptImportPathCompiler` regression in regex (PhilETaylor) + * bug #54102 [HttpClient] Fix deprecation on PHP 8.3 (nicolas-grekas) + * bug #54089 [Mailer] [Brevo] Remove tags from mandatory event arguments (palgalik) + * bug #54081 [DoctrineBridge] Safeguard dynamic access to Doctrine metadata properties (derrabus) + * bug #54080 [Routing] Enhance error handling in StaticPrefixCollection for compatibility with libpcre2-10.43 (Lustmored) + +* 6.4.4 (2024-02-27) + + * bug #53985 [HttpKernel] Allow tagged controllers in ControllerResolver (marein) + * bug #54054 [VarExporter] Bugfix/workaround jit issue (verfriemelt-dot-org) + * bug #54050 [Messenger] Revert "Resend failed retries back to failure transport " (ro0NL) + * bug #54045 [Config][Messenger][Security] Don't turn deprecations into exceptions when unserializing (nicolas-grekas) + * bug #54035 [DependencyInjection] Fix computing error messages involving service locators (nicolas-grekas) + * bug #53959 [Serializer] Fix unknown types normalization type when know type (Myks92) + * bug #53960 [Messenger] the 'use_notify' option is on the factory, not on the postgres connection (dbu) + * bug #54031 [ErrorHandler] Fix parsing messages that contain anonymous classes on PHP >= 8.3.3 (nicolas-grekas) + * bug #54014 [AssetMapper] Fix enquoted string pattern (smnandre) + * bug #54010 [Translation] Fix extracting qualified `t()` function calls (rvanvelzen) + * bug #53967 [ErrorHandler] return the unchanged text if preg_replace_callback() fails (xabbuh) + * bug #54009 [Console] Fix display of vertical Table on Windows OS (VincentLanglet) + * bug #54001 [Console] Fix display of Table on Windows OS (VincentLanglet) + * bug #53989 [FrameworkBundle] Fix config builder with extensions extended in `build()` (HypeMC) + * bug #54004 [WebProfilerBundle] disable turbo in web profiler toolbar to avoid link prefetching (davidgorges) + * bug #54006 [Process] Fix the `command -v` exception (kayw-geek) + * bug #53975 [Cache] explicitly cast boolean SSL stream options (xabbuh) + * bug #53926 [TwigBridge] foundation 5 layout: use form_label_content block for checkbox and radio labels (wetternest) + * bug #53913 [TwigBridge] Fix compat with Twig v3.9 (nicolas-grekas) + * bug #53819 [Doctrine Messenger] Fix support for pgsql + pgbouncer. (jwage) + * bug #53944 [Messenger] Gracefully fallback to empty queue config (Wirone) + * bug #53935 [Mailer] [Mailgun] Fix expecting payload without tags or user variables (norkunas) + * bug #53934 [Mailer] Fix signed emails breaking the profiler (HypeMC) + * bug #53924 [FrameworkBundle] Check if the _route attribute exists on the request (xvilo) + * bug #53910 [Messenger] Fix SQS visibility_timeout type (valtzu) + * bug #53891 [PropertyAccess] Fixes getValue() on an unitialized object property on a lazy ghost (priyadi) + * bug #53889 [HttpClient] Make retry strategy work again (Nyholm) + * bug #53906 [VarDumper] Fix serialization of stubs with null or uninitialized values (derrabus) + * bug #53890 [VarExporter] Uniform unitialized property error message under ghost and non-ghost objects (priyadi) + * bug #53893 [AssetMapper] Ignore comment lines in JavaScriptImportPathCompiler (smnandre) + * bug #53826 [DomCrawler][Form] Fix the exclusion of