diff --git a/CHANGELOG.md b/CHANGELOG.md index e683afb1d0..4c576eb8be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,8 @@ More information about our release strategy can be found in the [Development Guidelines](https://github.com/OpenConext/OpenConext-engineblock/wiki/Development-Guidelines#release-notes) on the EngineBlock wiki. -## UNRELEASED 7.2.0? / 8.0.0? -Upgrade to Symfony 6.4? +## UNRELEASED 7.2.0 +Upgrade to Symfony 7.4 Upgrade to `doctrine/dbal` 4 Bugfixes: diff --git a/component_info b/component_info index 9e05933168..6ea707df12 100644 --- a/component_info +++ b/component_info @@ -1,5 +1,5 @@ PHP_VERSION=82 -SYMFONY_VERSION=5 +SYMFONY_VERSION=7 NODE_VERSION=20 ENCORE=no ASSETIC=no diff --git a/composer.json b/composer.json index bd9d08d666..a7d39427de 100644 --- a/composer.json +++ b/composer.json @@ -30,27 +30,26 @@ "doctrine/orm": "^3.5.7", "guzzlehttp/guzzle": "^7.10", "incenteev/composer-parameter-handler": "^2.2", - "monolog/monolog": "^3.0", + "monolog/monolog": "^3.5", "openconext/monitor-bundle": "^4.2", "openconext/saml-value-object": "^3.0", "pimple/pimple": "^3.6", "ramsey/uuid": "^4.9.1", "robrichards/xmlseclibs": "^3.1.3", "simplesamlphp/saml2": "^4.19", - "symfony/asset": "^6.4", - "symfony/console": "^6.4", - "symfony/dotenv": "^6.4", - "symfony/expression-language": "^6.4", + "symfony/asset": "^7.4", + "symfony/console": "^7.4", + "symfony/dotenv": "^7.4", + "symfony/expression-language": "^7.4", "symfony/flex": "^2.9.0", - "symfony/form": "^6.4", - "symfony/framework-bundle": "^6.4", - "symfony/mailer": "6.4.*", - "symfony/monolog-bundle": "^3.10", - "symfony/security-bundle": "^6.4", - "symfony/translation": "^6.4", - "symfony/twig-bundle": "^6.4", - "symfony/validator": "^6.4", - "symfony/yaml": "^6.4", + "symfony/framework-bundle": "^7.4", + "symfony/mailer": "^7.4", + "symfony/monolog-bundle": "^4.0", + "symfony/security-bundle": "^7.4", + "symfony/translation": "^7.4", + "symfony/twig-bundle": "^7.4", + "symfony/validator": "^7.4", + "symfony/yaml": "^7.4", "twig/twig": "^3.22.0" }, "require-dev": { @@ -73,11 +72,11 @@ "rector/rector": "^2.2.7", "slevomat/coding-standard": "^8.28", "squizlabs/php_codesniffer": "^4.0", - "symfony/debug-bundle": "6.4.*", - "symfony/http-client": "6.4.*", + "symfony/debug-bundle": "^7.4", + "symfony/http-client": "^7.4", "symfony/phpunit-bridge": "^7.3.4", - "symfony/var-dumper": "6.4.*", - "symfony/web-profiler-bundle": "6.4.*" + "symfony/var-dumper": "^7.4", + "symfony/web-profiler-bundle": "^7.4" }, "replace": { "symfony/polyfill-mbstring": "1.99", @@ -140,7 +139,7 @@ "extra": { "symfony": { "allow-contrib": false, - "require": "6.4.*" + "require": "7.4.*" }, "symfony-var-dir": "var", "symfony-bin-dir": "bin", diff --git a/composer.lock b/composer.lock index ef5072ef4d..8ea35f2bea 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d123d1f6ab6f7d27241e6c65545bc0d5", + "content-hash": "19eeea20ede2f61534eaf59f084f20b4", "packages": [ { "name": "beberlei/assert", @@ -1657,16 +1657,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", + "version": "2.8.1", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "718f1ee6a878be5290af3557aeda0c91278361d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/718f1ee6a878be5290af3557aeda0c91278361d9", + "reference": "718f1ee6a878be5290af3557aeda0c91278361d9", "shasum": "" }, "require": { @@ -1753,7 +1753,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.8.1" }, "funding": [ { @@ -1769,7 +1769,7 @@ "type": "tidelift" } ], - "time": "2025-08-23T21:21:41+00:00" + "time": "2026-03-10T09:55:26+00:00" }, { "name": "incenteev/composer-parameter-handler", @@ -2803,28 +2803,28 @@ }, { "name": "symfony/asset", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "1bd59aa278691b6310ca56b996cf6e2619a6a347" + "reference": "d944ae87e4697af05aadeacfc5e603c3c18ef4fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/1bd59aa278691b6310ca56b996cf6e2619a6a347", - "reference": "1bd59aa278691b6310ca56b996cf6e2619a6a347", + "url": "https://api.github.com/repos/symfony/asset/zipball/d944ae87e4697af05aadeacfc5e603c3c18ef4fb", + "reference": "d944ae87e4697af05aadeacfc5e603c3c18ef4fb", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/http-foundation": "<5.4" + "symfony/http-foundation": "<6.4" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0" + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -2852,7 +2852,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v6.4.34" + "source": "https://github.com/symfony/asset/tree/v7.4.6" }, "funding": [ { @@ -2872,35 +2872,38 @@ "type": "tidelift" } ], - "time": "2026-02-07T09:15:39+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { "name": "symfony/cache", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "a0a1690543329685c044362c873b78c6de9d4faa" + "reference": "665522ec357540e66c294c08583b40ee576574f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/a0a1690543329685c044362c873b78c6de9d4faa", - "reference": "a0a1690543329685c044362c873b78c6de9d4faa", + "url": "https://api.github.com/repos/symfony/cache/zipball/665522ec357540e66c294c08583b40ee576574f0", + "reference": "665522ec357540e66c294c08583b40ee576574f0", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/cache": "^2.0|^3.0", "psr/log": "^1.1|^2|^3", - "symfony/cache-contracts": "^2.5|^3", + "symfony/cache-contracts": "^3.6", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3", - "symfony/var-exporter": "^6.3.6|^7.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "conflict": { - "doctrine/dbal": "<2.13.1", - "symfony/dependency-injection": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/var-dumper": "<5.4" + "doctrine/dbal": "<3.6", + "ext-redis": "<6.1", + "ext-relay": "<0.12.1", + "symfony/dependency-injection": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/var-dumper": "<6.4" }, "provide": { "psr/cache-implementation": "2.0|3.0", @@ -2909,15 +2912,16 @@ }, "require-dev": { "cache/integration-tests": "dev-master", - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "psr/simple-cache": "^1.0|^2.0|^3.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -2952,7 +2956,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.34" + "source": "https://github.com/symfony/cache/tree/v7.4.7" }, "funding": [ { @@ -2972,7 +2976,7 @@ "type": "tidelift" } ], - "time": "2026-02-20T15:06:30+00:00" + "time": "2026-03-06T08:14:57+00:00" }, { "name": "symfony/cache-contracts", @@ -3052,20 +3056,20 @@ }, { "name": "symfony/clock", - "version": "v6.4.30", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", - "reference": "fb2df4bc9e3037c4765ba7fd29e00167001a9b68" + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/clock/zipball/fb2df4bc9e3037c4765ba7fd29e00167001a9b68", - "reference": "fb2df4bc9e3037c4765ba7fd29e00167001a9b68", + "url": "https://api.github.com/repos/symfony/clock/zipball/9169f24776edde469914c1e7a1442a50f7a4e110", + "reference": "9169f24776edde469914c1e7a1442a50f7a4e110", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/clock": "^1.0", "symfony/polyfill-php83": "^1.28" }, @@ -3106,7 +3110,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v6.4.30" + "source": "https://github.com/symfony/clock/tree/v7.4.0" }, "funding": [ { @@ -3126,38 +3130,38 @@ "type": "tidelift" } ], - "time": "2025-11-11T21:24:34+00:00" + "time": "2025-11-12T15:39:26+00:00" }, { "name": "symfony/config", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "ce9cb0c0d281aaf188b802d4968e42bfb60701e9" + "reference": "6c17162555bfb58957a55bb0e43e00035b6ae3d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/ce9cb0c0d281aaf188b802d4968e42bfb60701e9", - "reference": "ce9cb0c0d281aaf188b802d4968e42bfb60701e9", + "url": "https://api.github.com/repos/symfony/config/zipball/6c17162555bfb58957a55bb0e43e00035b6ae3d5", + "reference": "6c17162555bfb58957a55bb0e43e00035b6ae3d5", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^7.1|^8.0", "symfony/polyfill-ctype": "~1.8" }, "conflict": { - "symfony/finder": "<5.4", + "symfony/finder": "<6.4", "symfony/service-contracts": "<2.5" }, "require-dev": { - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3185,7 +3189,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.34" + "source": "https://github.com/symfony/config/tree/v7.4.7" }, "funding": [ { @@ -3205,51 +3209,51 @@ "type": "tidelift" } ], - "time": "2026-02-24T17:34:50+00:00" + "time": "2026-03-06T10:41:14+00:00" }, { "name": "symfony/console", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "7b1f1c37eff5910ddda2831345467e593a5120ad" + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/7b1f1c37eff5910ddda2831345467e593a5120ad", - "reference": "7b1f1c37eff5910ddda2831345467e593a5120ad", + "url": "https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d", + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^5.4|^6.0|^7.0" + "symfony/string": "^7.2|^8.0" }, "conflict": { - "symfony/dependency-injection": "<5.4", - "symfony/dotenv": "<5.4", - "symfony/event-dispatcher": "<5.4", - "symfony/lock": "<5.4", - "symfony/process": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3283,7 +3287,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.34" + "source": "https://github.com/symfony/console/tree/v7.4.7" }, "funding": [ { @@ -3303,44 +3307,43 @@ "type": "tidelift" } ], - "time": "2026-02-23T15:42:15+00:00" + "time": "2026-03-06T14:06:20+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "91e49958b8a6092e48e4711894a1aeb1b151c62a" + "reference": "0f651e58f4917fb0e2cd261ccbfe3d71e6e0f5db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/91e49958b8a6092e48e4711894a1aeb1b151c62a", - "reference": "91e49958b8a6092e48e4711894a1aeb1b151c62a", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/0f651e58f4917fb0e2cd261ccbfe3d71e6e0f5db", + "reference": "0f651e58f4917fb0e2cd261ccbfe3d71e6e0f5db", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/container": "^1.1|^2.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/service-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4.20|^7.2.5" + "symfony/service-contracts": "^3.6", + "symfony/var-exporter": "^6.4.20|^7.2.5|^8.0" }, "conflict": { "ext-psr": "<1.1|>=2", - "symfony/config": "<6.1", - "symfony/finder": "<5.4", - "symfony/proxy-manager-bridge": "<6.3", - "symfony/yaml": "<5.4" + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" }, "provide": { "psr/container-implementation": "1.1|2.0", "symfony/service-implementation": "1.1|2.0|3.0" }, "require-dev": { - "symfony/config": "^6.1|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3368,7 +3371,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.34" + "source": "https://github.com/symfony/dependency-injection/tree/v7.4.7" }, "funding": [ { @@ -3388,7 +3391,7 @@ "type": "tidelift" } ], - "time": "2026-02-24T15:33:38+00:00" + "time": "2026-03-03T07:48:48+00:00" }, { "name": "symfony/deprecation-contracts", @@ -3459,67 +3462,68 @@ }, { "name": "symfony/doctrine-bridge", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-bridge.git", - "reference": "9e82991eda36e85b640644e1d8d34d89eff498a6" + "reference": "4fc5e2dd41be3c0b6321e0373072782edeff45ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/9e82991eda36e85b640644e1d8d34d89eff498a6", - "reference": "9e82991eda36e85b640644e1d8d34d89eff498a6", + "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/4fc5e2dd41be3c0b6321e0373072782edeff45ed", + "reference": "4fc5e2dd41be3c0b6321e0373072782edeff45ed", "shasum": "" }, "require": { - "doctrine/event-manager": "^1.2|^2", - "doctrine/persistence": "^2.5|^3.1|^4", - "php": ">=8.1", + "doctrine/event-manager": "^2", + "doctrine/persistence": "^3.1|^4", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "doctrine/dbal": "<2.13.1", + "doctrine/collections": "<1.8", + "doctrine/dbal": "<3.6", "doctrine/lexer": "<1.1", "doctrine/orm": "<2.15", - "symfony/cache": "<5.4", - "symfony/dependency-injection": "<6.2", - "symfony/form": "<5.4.38|>=6,<6.4.6|>=7,<7.0.6", - "symfony/http-foundation": "<6.3", - "symfony/http-kernel": "<6.2", - "symfony/lock": "<6.3", - "symfony/messenger": "<5.4", - "symfony/property-info": "<5.4", - "symfony/security-bundle": "<5.4", + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/form": "<6.4.6|>=7,<7.0.6", + "symfony/http-foundation": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/lock": "<6.4", + "symfony/messenger": "<6.4", + "symfony/property-info": "<6.4", + "symfony/security-bundle": "<6.4", "symfony/security-core": "<6.4", - "symfony/validator": "<6.4" + "symfony/validator": "<7.4" }, "require-dev": { - "doctrine/collections": "^1.0|^2.0", + "doctrine/collections": "^1.8|^2.0", "doctrine/data-fixtures": "^1.1|^2", - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "doctrine/orm": "^2.15|^3", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.2|^7.0", - "symfony/doctrine-messenger": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4.38|^6.4.6|^7.0.6", - "symfony/http-kernel": "^6.3|^7.0", - "symfony/lock": "^6.3|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/proxy-manager-bridge": "^6.4", - "symfony/security-core": "^6.4|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/doctrine-messenger": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/form": "^7.2|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/type-info": "^7.1.8|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "symfony-bridge", "autoload": { @@ -3547,7 +3551,7 @@ "description": "Provides integration for Doctrine with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-bridge/tree/v6.4.34" + "source": "https://github.com/symfony/doctrine-bridge/tree/v7.4.7" }, "funding": [ { @@ -3567,32 +3571,32 @@ "type": "tidelift" } ], - "time": "2026-02-06T08:53:22+00:00" + "time": "2026-03-05T08:16:50+00:00" }, { "name": "symfony/dotenv", - "version": "v6.4.30", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "924edbc9631b75302def0258ed1697948b17baf6" + "reference": "7e5529a0b02395cb4614cdf507495a4cef3115c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/924edbc9631b75302def0258ed1697948b17baf6", - "reference": "924edbc9631b75302def0258ed1697948b17baf6", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/7e5529a0b02395cb4614cdf507495a4cef3115c5", + "reference": "7e5529a0b02395cb4614cdf507495a4cef3115c5", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/console": "<5.4", - "symfony/process": "<5.4" + "symfony/console": "<6.4", + "symfony/process": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3625,7 +3629,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v6.4.30" + "source": "https://github.com/symfony/dotenv/tree/v7.4.7" }, "funding": [ { @@ -3645,35 +3649,38 @@ "type": "tidelift" } ], - "time": "2025-11-14T17:33:48+00:00" + "time": "2026-03-03T07:48:48+00:00" }, { "name": "symfony/error-handler", - "version": "v6.4.32", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "8c18400784fcb014dc73c8d5601a9576af7f8ad4" + "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/8c18400784fcb014dc73c8d5601a9576af7f8ad4", - "reference": "8c18400784fcb014dc73c8d5601a9576af7f8ad4", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8da531f364ddfee53e36092a7eebbbd0b775f6b8", + "reference": "8da531f364ddfee53e36092a7eebbbd0b775f6b8", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "conflict": { "symfony/deprecation-contracts": "<2.5", "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^5.4|^6.0|^7.0" + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -3704,7 +3711,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v6.4.32" + "source": "https://github.com/symfony/error-handler/tree/v7.4.4" }, "funding": [ { @@ -3724,28 +3731,28 @@ "type": "tidelift" } ], - "time": "2026-01-19T19:28:19+00:00" + "time": "2026-01-20T16:42:42+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v6.4.32", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "99d7e101826e6610606b9433248f80c1997cd20b" + "reference": "dc2c0eba1af673e736bb851d747d266108aea746" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/99d7e101826e6610606b9433248f80c1997cd20b", - "reference": "99d7e101826e6610606b9433248f80c1997cd20b", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/dc2c0eba1af673e736bb851d747d266108aea746", + "reference": "dc2c0eba1af673e736bb851d747d266108aea746", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<5.4", + "symfony/dependency-injection": "<6.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -3754,13 +3761,14 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -3788,7 +3796,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.32" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.4.4" }, "funding": [ { @@ -3808,7 +3816,7 @@ "type": "tidelift" } ], - "time": "2026-01-05T11:13:48+00:00" + "time": "2026-01-05T11:45:34+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3888,21 +3896,21 @@ }, { "name": "symfony/expression-language", - "version": "v6.4.32", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "89c10ef5ca65968ec7ce7ce033c7f36eeb1b0312" + "reference": "f3a6497eb6573e185f2ec41cd3b3f0cd68ddf667" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/89c10ef5ca65968ec7ce7ce033c7f36eeb1b0312", - "reference": "89c10ef5ca65968ec7ce7ce033c7f36eeb1b0312", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/f3a6497eb6573e185f2ec41cd3b3f0cd68ddf667", + "reference": "f3a6497eb6573e185f2ec41cd3b3f0cd68ddf667", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/cache": "^5.4|^6.0|^7.0", + "php": ">=8.2", + "symfony/cache": "^6.4|^7.0|^8.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/service-contracts": "^2.5|^3" }, @@ -3932,7 +3940,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v6.4.32" + "source": "https://github.com/symfony/expression-language/tree/v7.4.4" }, "funding": [ { @@ -3952,29 +3960,29 @@ "type": "tidelift" } ], - "time": "2026-01-04T11:52:13+00:00" + "time": "2026-01-05T08:47:25+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3" + "reference": "3ebc794fa5315e59fd122561623c2e2e4280538e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/01ffe0411b842f93c571e5c391f289c3fdd498c3", - "reference": "01ffe0411b842f93c571e5c391f289c3fdd498c3", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/3ebc794fa5315e59fd122561623c2e2e4280538e", + "reference": "3ebc794fa5315e59fd122561623c2e2e4280538e", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4002,7 +4010,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.34" + "source": "https://github.com/symfony/filesystem/tree/v7.4.6" }, "funding": [ { @@ -4022,27 +4030,27 @@ "type": "tidelift" } ], - "time": "2026-02-24T17:51:06+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/finder", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896" + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9590e86be1d1c57bfbb16d0dd040345378c20896", - "reference": "9590e86be1d1c57bfbb16d0dd040345378c20896", + "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "require-dev": { - "symfony/filesystem": "^6.0|^7.0" + "symfony/filesystem": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4070,7 +4078,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.34" + "source": "https://github.com/symfony/finder/tree/v7.4.6" }, "funding": [ { @@ -4090,7 +4098,7 @@ "type": "tidelift" } ], - "time": "2026-01-28T15:16:37+00:00" + "time": "2026-01-29T09:40:50+00:00" }, { "name": "symfony/flex", @@ -4165,211 +4173,115 @@ ], "time": "2025-11-16T09:38:19+00:00" }, - { - "name": "symfony/form", - "version": "v6.4.34", - "source": { - "type": "git", - "url": "https://github.com/symfony/form.git", - "reference": "ed9275a133809bb48d949ba6dfdc808a819ebea2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/form/zipball/ed9275a133809bb48d949ba6dfdc808a819ebea2", - "reference": "ed9275a133809bb48d949ba6dfdc808a819ebea2", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/options-resolver": "^5.4|^6.0|^7.0", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-icu": "^1.21", - "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/service-contracts": "^2.5|^3" - }, - "conflict": { - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", - "symfony/doctrine-bridge": "<5.4.21|>=6,<6.2.7", - "symfony/error-handler": "<5.4", - "symfony/framework-bundle": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", - "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<6.3" - }, - "require-dev": { - "doctrine/collections": "^1.0|^2.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/html-sanitizer": "^6.1|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.2|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Form\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Allows to easily create, process and reuse HTML forms", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/form/tree/v6.4.34" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2026-02-23T17:59:52+00:00" - }, { "name": "symfony/framework-bundle", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "5b5d19473f22d699811a41b01cef2462bc42b238" + "reference": "c94bc78c85d76af67918404a95d44940f66a7c2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/5b5d19473f22d699811a41b01cef2462bc42b238", - "reference": "5b5d19473f22d699811a41b01cef2462bc42b238", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/c94bc78c85d76af67918404a95d44940f66a7c2f", + "reference": "c94bc78c85d76af67918404a95d44940f66a7c2f", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.1", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.4.12|^7.0", + "php": ">=8.2", + "symfony/cache": "^6.4.12|^7.0|^8.0", + "symfony/config": "^7.4.4|^8.0.4", + "symfony/dependency-injection": "^7.4.4|^8.0.4", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.1|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/filesystem": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4", + "symfony/error-handler": "^7.3|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/filesystem": "^7.1|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/routing": "^6.4|^7.0" + "symfony/polyfill-php85": "^1.32", + "symfony/routing": "^7.4|^8.0" }, "conflict": { - "doctrine/annotations": "<1.13.1", "doctrine/persistence": "<1.3", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/asset": "<5.4", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/asset": "<6.4", "symfony/asset-mapper": "<6.4", - "symfony/clock": "<6.3", - "symfony/console": "<5.4|>=7.0", + "symfony/clock": "<6.4", + "symfony/console": "<6.4", "symfony/dom-crawler": "<6.4", - "symfony/dotenv": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<6.3", - "symfony/lock": "<5.4", - "symfony/mailer": "<5.4", - "symfony/messenger": "<6.3", + "symfony/dotenv": "<6.4", + "symfony/form": "<7.4", + "symfony/http-client": "<6.4", + "symfony/lock": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<7.4", "symfony/mime": "<6.4", - "symfony/property-access": "<5.4", - "symfony/property-info": "<5.4", - "symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", - "symfony/security-core": "<5.4", - "symfony/security-csrf": "<5.4", - "symfony/serializer": "<6.4", - "symfony/stopwatch": "<5.4", - "symfony/translation": "<6.4", - "symfony/twig-bridge": "<5.4", - "symfony/twig-bundle": "<5.4", + "symfony/security-core": "<6.4", + "symfony/security-csrf": "<7.2", + "symfony/serializer": "<7.2.5", + "symfony/stopwatch": "<6.4", + "symfony/translation": "<7.3", + "symfony/twig-bridge": "<6.4", + "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4", "symfony/web-profiler-bundle": "<6.4", - "symfony/workflow": "<6.4" + "symfony/webhook": "<7.2", + "symfony/workflow": "<7.4" }, "require-dev": { - "doctrine/annotations": "^1.13.1|^2", "doctrine/persistence": "^1.3|^2|^3", "dragonmantank/cron-expression": "^3.1", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "seld/jsonlint": "^1.10", - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/asset-mapper": "^6.4|^7.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.2|^7.0", - "symfony/console": "^5.4.9|^6.0.9|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dom-crawler": "^6.4|^7.0", - "symfony/dotenv": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/html-sanitizer": "^6.1|^7.0", - "symfony/http-client": "^6.3|^7.0", - "symfony/lock": "^5.4|^6.0|^7.0", - "symfony/mailer": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.3|^7.0", - "symfony/mime": "^6.4|^7.0", - "symfony/notifier": "^5.4|^6.0|^7.0", + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/asset-mapper": "^6.4|^7.0|^8.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/dotenv": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/html-sanitizer": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/json-streamer": "^7.3|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/mailer": "^6.4|^7.0|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/notifier": "^6.4|^7.0|^8.0", + "symfony/object-mapper": "^7.3|^8.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/scheduler": "^6.4.4|^7.0.4", - "symfony/security-bundle": "^5.4|^6.0|^7.0", - "symfony/semaphore": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/string": "^5.4|^6.0|^7.0", - "symfony/translation": "^6.4|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/web-link": "^5.4|^6.0|^7.0", - "symfony/workflow": "^6.4|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/twig": "^2.10|^3.0.4" + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6|^8.0", + "symfony/scheduler": "^6.4.4|^7.0.4|^8.0", + "symfony/security-bundle": "^6.4|^7.0|^8.0", + "symfony/semaphore": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.2.5|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/translation": "^7.3|^8.0", + "symfony/twig-bundle": "^6.4|^7.0|^8.0", + "symfony/type-info": "^7.1.8|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/web-link": "^6.4|^7.0|^8.0", + "symfony/webhook": "^7.2|^8.0", + "symfony/workflow": "^7.4|^8.0", + "symfony/yaml": "^7.3|^8.0", + "twig/twig": "^3.12" }, "type": "symfony-bundle", "autoload": { @@ -4397,7 +4309,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v6.4.34" + "source": "https://github.com/symfony/framework-bundle/tree/v7.4.7" }, "funding": [ { @@ -4417,40 +4329,41 @@ "type": "tidelift" } ], - "time": "2026-02-24T16:00:52+00:00" + "time": "2026-03-06T15:39:55+00:00" }, { "name": "symfony/http-foundation", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "5bb346d1b4b2a616e5c3d99b3ee4d5810735c535" + "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5bb346d1b4b2a616e5c3d99b3ee4d5810735c535", - "reference": "5bb346d1b4b2a616e5c3d99b3ee4d5810735c535", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f94b3e7b7dafd40e666f0c9ff2084133bae41e81", + "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php83": "^1.27" + "symfony/polyfill-mbstring": "^1.1" }, "conflict": { + "doctrine/dbal": "<3.6", "symfony/cache": "<6.4.12|>=7.0,<7.1.5" }, "require-dev": { - "doctrine/dbal": "^2.13.1|^3|^4", + "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", - "symfony/cache": "^6.4.12|^7.1.5", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4.12|^7.1.5|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4478,7 +4391,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v6.4.34" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.7" }, "funding": [ { @@ -4498,77 +4411,78 @@ "type": "tidelift" } ], - "time": "2026-02-21T15:48:41+00:00" + "time": "2026-03-06T13:15:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "006a49fc4f41ee21a6ca61e69caed1c30b29f07c" + "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/006a49fc4f41ee21a6ca61e69caed1c30b29f07c", - "reference": "006a49fc4f41ee21a6ca61e69caed1c30b29f07c", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3b3fcf386c809be990c922e10e4c620d6367cab1", + "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^7.3|^8.0", + "symfony/http-foundation": "^7.4|^8.0", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.4", - "symfony/config": "<6.1", - "symfony/console": "<5.4", + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", - "symfony/doctrine-bridge": "<5.4", - "symfony/form": "<5.4", - "symfony/http-client": "<5.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/flex": "<2.10", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4", - "symfony/translation": "<5.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", "symfony/translation-contracts": "<2.5", - "symfony/twig-bridge": "<5.4", + "symfony/twig-bridge": "<6.4", "symfony/validator": "<6.4", - "symfony/var-dumper": "<6.3", - "twig/twig": "<2.13" + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" }, "provide": { "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.2|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^6.4.1|^7.0.1", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^2.5|^3", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4.5|^6.0.5|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.4|^7.0.4", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^7.1|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/serializer": "^7.1|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3", - "symfony/uid": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.4|^7.0", - "symfony/var-exporter": "^6.2|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/uid": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" }, "type": "library", "autoload": { @@ -4596,7 +4510,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v6.4.34" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.7" }, "funding": [ { @@ -4616,43 +4530,43 @@ "type": "tidelift" } ], - "time": "2026-02-26T08:27:11+00:00" + "time": "2026-03-06T16:33:18+00:00" }, { "name": "symfony/mailer", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "01b846f48e53ee4096692a383637a1fa4d577301" + "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/01b846f48e53ee4096692a383637a1fa4d577301", - "reference": "01b846f48e53ee4096692a383637a1fa4d577301", + "url": "https://api.github.com/repos/symfony/mailer/zipball/b02726f39a20bc65e30364f5c750c4ddbf1f58e9", + "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9", "shasum": "" }, "require": { "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.1", + "php": ">=8.2", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/mime": "^6.2|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/mime": "^7.2|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", - "symfony/messenger": "<6.2", - "symfony/mime": "<6.2", - "symfony/twig-bridge": "<6.2.1" + "symfony/http-kernel": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/twig-bridge": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/messenger": "^6.2|^7.0", - "symfony/twig-bridge": "^6.2|^7.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -4680,7 +4594,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v6.4.34" + "source": "https://github.com/symfony/mailer/tree/v7.4.6" }, "funding": [ { @@ -4700,44 +4614,44 @@ "type": "tidelift" } ], - "time": "2026-02-24T09:34:36+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/mime", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "2b32fbbe10b36a8379efab6e702ad8b917151839" + "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/2b32fbbe10b36a8379efab6e702ad8b917151839", - "reference": "2b32fbbe10b36a8379efab6e702ad8b917151839", + "url": "https://api.github.com/repos/symfony/mime/zipball/da5ab4fde3f6c88ab06e96185b9922f48b677cd1", + "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<5.4", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/mailer": "<6.4", "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.4|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3" + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0" }, "type": "library", "autoload": { @@ -4769,7 +4683,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.34" + "source": "https://github.com/symfony/mime/tree/v7.4.7" }, "funding": [ { @@ -4789,42 +4703,42 @@ "type": "tidelift" } ], - "time": "2026-02-02T17:01:23+00:00" + "time": "2026-03-05T15:24:09+00:00" }, { "name": "symfony/monolog-bridge", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "ee2d0150031b7c6ee2a1149fddddef3e7cdec117" + "reference": "69e98e7e10dae3daa896ef0f20e17a3928362d88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/ee2d0150031b7c6ee2a1149fddddef3e7cdec117", - "reference": "ee2d0150031b7c6ee2a1149fddddef3e7cdec117", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/69e98e7e10dae3daa896ef0f20e17a3928362d88", + "reference": "69e98e7e10dae3daa896ef0f20e17a3928362d88", "shasum": "" }, "require": { - "monolog/monolog": "^1.25.1|^2|^3", - "php": ">=8.1", + "monolog/monolog": "^3", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/console": "<5.4", - "symfony/http-foundation": "<5.4", - "symfony/security-core": "<5.4" + "symfony/console": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/security-core": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/mailer": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/security-core": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/mailer": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "symfony-bridge", "autoload": { @@ -4852,7 +4766,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.34" + "source": "https://github.com/symfony/monolog-bridge/tree/v7.4.6" }, "funding": [ { @@ -4872,37 +4786,36 @@ "type": "tidelift" } ], - "time": "2026-02-16T20:44:03+00:00" + "time": "2026-02-17T07:53:42+00:00" }, { "name": "symfony/monolog-bundle", - "version": "v3.11.1", + "version": "v4.0.1", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bundle.git", - "reference": "0e675a6e08f791ef960dc9c7e392787111a3f0c1" + "reference": "3b4ee2717ee56c5e1edb516140a175eb2a72bc66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/0e675a6e08f791ef960dc9c7e392787111a3f0c1", - "reference": "0e675a6e08f791ef960dc9c7e392787111a3f0c1", + "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/3b4ee2717ee56c5e1edb516140a175eb2a72bc66", + "reference": "3b4ee2717ee56c5e1edb516140a175eb2a72bc66", "shasum": "" }, "require": { "composer-runtime-api": "^2.0", - "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0", - "php": ">=8.1", - "symfony/config": "^6.4 || ^7.0", - "symfony/dependency-injection": "^6.4 || ^7.0", - "symfony/deprecation-contracts": "^2.5 || ^3.0", - "symfony/http-kernel": "^6.4 || ^7.0", - "symfony/monolog-bridge": "^6.4 || ^7.0", + "monolog/monolog": "^3.5", + "php": ">=8.2", + "symfony/config": "^7.3 || ^8.0", + "symfony/dependency-injection": "^7.3 || ^8.0", + "symfony/http-kernel": "^7.3 || ^8.0", + "symfony/monolog-bridge": "^7.3 || ^8.0", "symfony/polyfill-php84": "^1.30" }, "require-dev": { - "symfony/console": "^6.4 || ^7.0", - "symfony/phpunit-bridge": "^7.3.3", - "symfony/yaml": "^6.4 || ^7.0" + "phpunit/phpunit": "^11.5.41 || ^12.3", + "symfony/console": "^7.3 || ^8.0", + "symfony/yaml": "^7.3 || ^8.0" }, "type": "symfony-bundle", "autoload": { @@ -4932,7 +4845,7 @@ ], "support": { "issues": "https://github.com/symfony/monolog-bundle/issues", - "source": "https://github.com/symfony/monolog-bundle/tree/v3.11.1" + "source": "https://github.com/symfony/monolog-bundle/tree/v4.0.1" }, "funding": [ { @@ -4952,102 +4865,31 @@ "type": "tidelift" } ], - "time": "2025-12-08T07:58:26+00:00" - }, - { - "name": "symfony/options-resolver", - "version": "v6.4.30", - "source": { - "type": "git", - "url": "https://github.com/symfony/options-resolver.git", - "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", - "reference": "eeaa8cabe54c7b3516938c72a4a161c0cc80a34f", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\OptionsResolver\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an improved replacement for the array_replace PHP function", - "homepage": "https://symfony.com", - "keywords": [ - "config", - "configuration", - "options" - ], - "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.4.30" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-11-12T13:06:53+00:00" + "time": "2025-12-08T08:00:13+00:00" }, { "name": "symfony/password-hasher", - "version": "v6.4.32", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "fbdfa5a2ca218ec8bb9029517426df2d780bdba9" + "reference": "376755eb9c9857d78aedb68341ad2f46d1908b29" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/fbdfa5a2ca218ec8bb9029517426df2d780bdba9", - "reference": "fbdfa5a2ca218ec8bb9029517426df2d780bdba9", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/376755eb9c9857d78aedb68341ad2f46d1908b29", + "reference": "376755eb9c9857d78aedb68341ad2f46d1908b29", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "conflict": { - "symfony/security-core": "<5.4" + "symfony/security-core": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/security-core": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5079,7 +4921,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v6.4.32" + "source": "https://github.com/symfony/password-hasher/tree/v7.4.6" }, "funding": [ { @@ -5099,7 +4941,7 @@ "type": "tidelift" } ], - "time": "2026-01-01T21:24:53+00:00" + "time": "2026-02-11T16:03:16+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5267,24 +5109,25 @@ "time": "2025-06-27T09:58:17+00:00" }, { - "name": "symfony/polyfill-intl-icu", + "name": "symfony/polyfill-intl-idn", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-icu.git", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c" + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", - "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { - "ext-intl": "For best performance and support of other locales than \"en\"" + "ext-intl": "For best performance" }, "type": "library", "extra": { @@ -5298,14 +5141,8 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Icu\\": "" - }, - "classmap": [ - "Resources/stubs" - ], - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5313,26 +5150,30 @@ ], "authors": [ { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's ICU-related data and classes", + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "icu", + "idn", "intl", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" }, "funding": [ { @@ -5352,25 +5193,24 @@ "type": "tidelift" } ], - "time": "2025-06-20T22:24:30+00:00" + "time": "2024-09-10T14:38:51+00:00" }, { - "name": "symfony/polyfill-intl-idn", + "name": "symfony/polyfill-intl-normalizer", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", - "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.2", - "symfony/polyfill-intl-normalizer": "^1.10" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -5387,8 +5227,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Idn\\": "" - } + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -5396,30 +5239,26 @@ ], "authors": [ { - "name": "Laurent Bassin", - "email": "laurent@bassin.info" - }, - { - "name": "Trevor Rowbotham", - "email": "trevor.rowbotham@pm.me" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "idn", "intl", + "normalizer", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" }, "funding": [ { @@ -5439,28 +5278,25 @@ "type": "tidelift" } ], - "time": "2024-09-10T14:38:51+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-intl-normalizer", + "name": "symfony/polyfill-php83", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", "shasum": "" }, "require": { "php": ">=7.2" }, - "suggest": { - "ext-intl": "For best performance" - }, "type": "library", "extra": { "thanks": { @@ -5473,7 +5309,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + "Symfony\\Polyfill\\Php83\\": "" }, "classmap": [ "Resources/stubs" @@ -5493,18 +5329,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "intl", - "normalizer", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" }, "funding": [ { @@ -5524,20 +5358,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-07-08T02:45:35+00:00" }, { - "name": "symfony/polyfill-php83", + "name": "symfony/polyfill-php84", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5" + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/17f6f9a6b1735c0f163024d959f700cfbc5155e5", - "reference": "17f6f9a6b1735c0f163024d959f700cfbc5155e5", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", + "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", "shasum": "" }, "require": { @@ -5555,7 +5389,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Polyfill\\Php84\\": "" }, "classmap": [ "Resources/stubs" @@ -5575,7 +5409,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -5584,7 +5418,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" }, "funding": [ { @@ -5604,20 +5438,20 @@ "type": "tidelift" } ], - "time": "2025-07-08T02:45:35+00:00" + "time": "2025-06-24T13:30:11+00:00" }, { - "name": "symfony/polyfill-php84", + "name": "symfony/polyfill-php85", "version": "v1.33.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php84.git", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191" + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191", - "reference": "d8ced4d875142b6a7426000426b8abc631d6b191", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", + "reference": "d4e5fcd4ab3d998ab16c0db48e6cbb9a01993f91", "shasum": "" }, "require": { @@ -5635,7 +5469,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php84\\": "" + "Symfony\\Polyfill\\Php85\\": "" }, "classmap": [ "Resources/stubs" @@ -5655,7 +5489,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -5664,7 +5498,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-php85/tree/v1.33.0" }, "funding": [ { @@ -5684,29 +5518,29 @@ "type": "tidelift" } ], - "time": "2025-06-24T13:30:11+00:00" + "time": "2025-06-23T16:12:55+00:00" }, { "name": "symfony/property-access", - "version": "v6.4.32", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/property-access.git", - "reference": "6dfa655ac9e9860c05cabb287f34da86b18c237e" + "reference": "fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-access/zipball/6dfa655ac9e9860c05cabb287f34da86b18c237e", - "reference": "6dfa655ac9e9860c05cabb287f34da86b18c237e", + "url": "https://api.github.com/repos/symfony/property-access/zipball/fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1", + "reference": "fa49bf1ca8fce1ba0e2dba4e4658554cfb9364b1", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/property-info": "^6.4.32|~7.3.10|^7.4.4" + "php": ">=8.2", + "symfony/property-info": "^6.4.32|~7.3.10|^7.4.4|^8.0.4" }, "require-dev": { - "symfony/cache": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/var-exporter": "^6.4.1|^7.0.1|^8.0" }, "type": "library", "autoload": { @@ -5745,7 +5579,7 @@ "reflection" ], "support": { - "source": "https://github.com/symfony/property-access/tree/v6.4.32" + "source": "https://github.com/symfony/property-access/tree/v7.4.4" }, "funding": [ { @@ -5765,41 +5599,41 @@ "type": "tidelift" } ], - "time": "2026-01-05T08:25:17+00:00" + "time": "2026-01-05T08:47:25+00:00" }, { "name": "symfony/property-info", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/property-info.git", - "reference": "916455e4c9dcddbebfd101f29d7983841c3564e0" + "reference": "02501d75fd834345da3ecdd8e3200ced39e370f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/property-info/zipball/916455e4c9dcddbebfd101f29d7983841c3564e0", - "reference": "916455e4c9dcddbebfd101f29d7983841c3564e0", + "url": "https://api.github.com/repos/symfony/property-info/zipball/02501d75fd834345da3ecdd8e3200ced39e370f8", + "reference": "02501d75fd834345da3ecdd8e3200ced39e370f8", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/string": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/type-info": "^7.4.7|^8.0.7" }, "conflict": { - "doctrine/annotations": "<1.12", - "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1", - "symfony/cache": "<5.4", - "symfony/dependency-injection": "<5.4|>=6.0,<6.4", - "symfony/serializer": "<5.4" + "symfony/cache": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "phpstan/phpdoc-parser": "^1.0|^2.0", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/serializer": "^5.4|^6.4|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5835,7 +5669,7 @@ "validator" ], "support": { - "source": "https://github.com/symfony/property-info/tree/v6.4.34" + "source": "https://github.com/symfony/property-info/tree/v7.4.7" }, "funding": [ { @@ -5855,40 +5689,38 @@ "type": "tidelift" } ], - "time": "2026-02-13T09:42:46+00:00" + "time": "2026-03-04T15:53:26+00:00" }, { "name": "symfony/routing", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47" + "reference": "238d749c56b804b31a9bf3e26519d93b65a60938" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47", - "reference": "5ab3a3e1a03535ec5ca6ce2d39e4369a1096ae47", + "url": "https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938", + "reference": "238d749c56b804b31a9bf3e26519d93b65a60938", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "conflict": { - "doctrine/annotations": "<1.12", - "symfony/config": "<6.2", - "symfony/dependency-injection": "<5.4", - "symfony/yaml": "<5.4" + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.12|^2", "psr/log": "^1|^2|^3", - "symfony/config": "^6.2|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -5922,7 +5754,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v6.4.34" + "source": "https://github.com/symfony/routing/tree/v7.4.6" }, "funding": [ { @@ -5942,75 +5774,71 @@ "type": "tidelift" } ], - "time": "2026-02-24T17:34:50+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/security-bundle", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/security-bundle.git", - "reference": "f67bd24782a80095e9b8953e18d01983b9fe8e34" + "reference": "d79c6d9a373fe8585e85bcfca4c24b9783214263" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-bundle/zipball/f67bd24782a80095e9b8953e18d01983b9fe8e34", - "reference": "f67bd24782a80095e9b8953e18d01983b9fe8e34", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/d79c6d9a373fe8585e85bcfca4c24b9783214263", + "reference": "d79c6d9a373fe8585e85bcfca4c24b9783214263", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.1", - "symfony/clock": "^6.3|^7.0", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.4.11|^7.1.4", + "php": ">=8.2", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^6.4.11|^7.1.4|^8.0", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^6.2|^7.0", - "symfony/http-kernel": "^6.2", - "symfony/password-hasher": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.2|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/security-http": "^6.3.6|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", + "symfony/password-hasher": "^6.4|^7.0|^8.0", + "symfony/security-core": "^7.4|^8.0", + "symfony/security-csrf": "^6.4|^7.0|^8.0", + "symfony/security-http": "^7.4|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/browser-kit": "<5.4", - "symfony/console": "<5.4", + "symfony/browser-kit": "<6.4", + "symfony/console": "<6.4", "symfony/framework-bundle": "<6.4", - "symfony/http-client": "<5.4", - "symfony/ldap": "<5.4", + "symfony/http-client": "<6.4", + "symfony/ldap": "<6.4", "symfony/serializer": "<6.4", - "symfony/twig-bundle": "<5.4", + "symfony/twig-bundle": "<6.4", "symfony/validator": "<6.4" }, "require-dev": { - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/dom-crawler": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/ldap": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/twig-bridge": "^5.4|^6.0|^7.0", - "symfony/twig-bundle": "^5.4|^6.0|^7.0", - "symfony/validator": "^6.4|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4", - "web-token/jwt-checker": "^3.1", - "web-token/jwt-signature-algorithm-ecdsa": "^3.1", - "web-token/jwt-signature-algorithm-eddsa": "^3.1", - "web-token/jwt-signature-algorithm-hmac": "^3.1", - "web-token/jwt-signature-algorithm-none": "^3.1", - "web-token/jwt-signature-algorithm-rsa": "^3.1" + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/dom-crawler": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/form": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/ldap": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0", + "symfony/twig-bundle": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0", + "twig/twig": "^3.15", + "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "symfony-bundle", "autoload": { @@ -6038,7 +5866,7 @@ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-bundle/tree/v6.4.34" + "source": "https://github.com/symfony/security-bundle/tree/v7.4.6" }, "funding": [ { @@ -6058,49 +5886,50 @@ "type": "tidelift" } ], - "time": "2026-02-22T21:48:58+00:00" + "time": "2026-02-22T22:01:45+00:00" }, { "name": "symfony/security-core", - "version": "v6.4.31", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/security-core.git", - "reference": "fa269ad61a021cc54329dc96e57bed78ba720bfe" + "reference": "958a70725a8d669bec6721f4cd318d209712e944" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-core/zipball/fa269ad61a021cc54329dc96e57bed78ba720bfe", - "reference": "fa269ad61a021cc54329dc96e57bed78ba720bfe", + "url": "https://api.github.com/repos/symfony/security-core/zipball/958a70725a8d669bec6721f4cd318d209712e944", + "reference": "958a70725a8d669bec6721f4cd318d209712e944", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/event-dispatcher-contracts": "^2.5|^3", - "symfony/password-hasher": "^5.4|^6.0|^7.0", + "symfony/password-hasher": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/event-dispatcher": "<5.4", - "symfony/http-foundation": "<5.4", - "symfony/ldap": "<5.4", - "symfony/security-guard": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", - "symfony/validator": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/http-foundation": "<6.4", + "symfony/ldap": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/validator": "<6.4" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "psr/container": "^1.1|^2.0", "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/event-dispatcher": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/ldap": "^5.4|^6.0|^7.0", - "symfony/string": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", - "symfony/validator": "^6.4|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/ldap": "^6.4|^7.0|^8.0", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4.3|^7.0.3|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6128,7 +5957,7 @@ "description": "Symfony Security Component - Core Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-core/tree/v6.4.31" + "source": "https://github.com/symfony/security-core/tree/v7.4.4" }, "funding": [ { @@ -6148,31 +5977,33 @@ "type": "tidelift" } ], - "time": "2025-12-17T22:32:13+00:00" + "time": "2026-01-14T09:36:49+00:00" }, { "name": "symfony/security-csrf", - "version": "v6.4.31", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/security-csrf.git", - "reference": "52f62836fcb19cd351ef3a2aa9cf61a489e8990f" + "reference": "d01adcd3141bec95e4cfd338f6b4482f1dd6a42b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-csrf/zipball/52f62836fcb19cd351ef3a2aa9cf61a489e8990f", - "reference": "52f62836fcb19cd351ef3a2aa9cf61a489e8990f", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/d01adcd3141bec95e4cfd338f6b4482f1dd6a42b", + "reference": "d01adcd3141bec95e4cfd338f6b4482f1dd6a42b", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/security-core": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/security-core": "^6.4|^7.0|^8.0" }, "conflict": { - "symfony/http-foundation": "<5.4" + "symfony/http-foundation": "<6.4" }, "require-dev": { - "symfony/http-foundation": "^5.4|^6.0|^7.0" + "psr/log": "^1|^2|^3", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6200,7 +6031,7 @@ "description": "Symfony Security Component - CSRF Library", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-csrf/tree/v6.4.31" + "source": "https://github.com/symfony/security-csrf/tree/v7.4.6" }, "funding": [ { @@ -6220,51 +6051,51 @@ "type": "tidelift" } ], - "time": "2025-12-17T22:32:13+00:00" + "time": "2026-02-11T16:03:16+00:00" }, { "name": "symfony/security-http", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/security-http.git", - "reference": "894bb42b39bfb240a1f82c9a46a1ce9402a31a6f" + "reference": "52ce5ef5708900dcab9f55750cf81250a0ebba9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/security-http/zipball/894bb42b39bfb240a1f82c9a46a1ce9402a31a6f", - "reference": "894bb42b39bfb240a1f82c9a46a1ce9402a31a6f", + "url": "https://api.github.com/repos/symfony/security-http/zipball/52ce5ef5708900dcab9f55750cf81250a0ebba9f", + "reference": "52ce5ef5708900dcab9f55750cf81250a0ebba9f", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", - "symfony/http-foundation": "^6.2|^7.0", - "symfony/http-kernel": "^6.3|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", "symfony/polyfill-mbstring": "~1.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/security-core": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/security-core": "^7.3|^8.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { - "symfony/clock": "<6.3", - "symfony/event-dispatcher": "<5.4.9|>=6,<6.0.9", + "symfony/clock": "<6.4", "symfony/http-client-contracts": "<3.0", - "symfony/security-bundle": "<5.4", - "symfony/security-csrf": "<5.4" + "symfony/security-bundle": "<6.4", + "symfony/security-csrf": "<6.4" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/clock": "^6.3|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/clock": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^3.0", - "symfony/rate-limiter": "^5.4|^6.0|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "web-token/jwt-checker": "^3.1", - "web-token/jwt-signature-algorithm-ecdsa": "^3.1" + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/security-csrf": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "web-token/jwt-library": "^3.3.2|^4.0" }, "type": "library", "autoload": { @@ -6292,7 +6123,7 @@ "description": "Symfony Security Component - HTTP Integration", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/security-http/tree/v6.4.34" + "source": "https://github.com/symfony/security-http/tree/v7.4.6" }, "funding": [ { @@ -6312,7 +6143,7 @@ "type": "tidelift" } ], - "time": "2026-02-16T20:44:03+00:00" + "time": "2026-02-18T09:46:18+00:00" }, { "name": "symfony/service-contracts", @@ -6403,20 +6234,20 @@ }, { "name": "symfony/stopwatch", - "version": "v6.4.24", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898" + "reference": "8a24af0a2e8a872fb745047180649b8418303084" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898", - "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/8a24af0a2e8a872fb745047180649b8418303084", + "reference": "8a24af0a2e8a872fb745047180649b8418303084", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/service-contracts": "^2.5|^3" }, "type": "library", @@ -6445,7 +6276,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.24" + "source": "https://github.com/symfony/stopwatch/tree/v7.4.0" }, "funding": [ { @@ -6465,26 +6296,27 @@ "type": "tidelift" } ], - "time": "2025-07-10T08:14:14+00:00" + "time": "2025-08-04T07:05:15+00:00" }, { "name": "symfony/string", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432" + "reference": "9f209231affa85aa930a5e46e6eb03381424b30b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/2adaf4106f2ef4c67271971bde6d3fe0a6936432", - "reference": "2adaf4106f2ef4c67271971bde6d3fe0a6936432", + "url": "https://api.github.com/repos/symfony/string/zipball/9f209231affa85aa930a5e46e6eb03381424b30b", + "reference": "9f209231affa85aa930a5e46e6eb03381424b30b", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-grapheme": "~1.33", "symfony/polyfill-intl-normalizer": "~1.0", "symfony/polyfill-mbstring": "~1.0" }, @@ -6492,10 +6324,11 @@ "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/intl": "^6.2|^7.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^5.4|^6.0|^7.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6534,7 +6367,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.34" + "source": "https://github.com/symfony/string/tree/v7.4.6" }, "funding": [ { @@ -6554,55 +6387,56 @@ "type": "tidelift" } ], - "time": "2026-02-08T20:44:54+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { "name": "symfony/translation", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "d07d117db41341511671b0a1a2be48f2772189ce" + "reference": "1888cf064399868af3784b9e043240f1d89d25ce" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/d07d117db41341511671b0a1a2be48f2772189ce", - "reference": "d07d117db41341511671b0a1a2be48f2772189ce", + "url": "https://api.github.com/repos/symfony/translation/zipball/1888cf064399868af3784b9e043240f1d89d25ce", + "reference": "1888cf064399868af3784b9e043240f1d89d25ce", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/translation-contracts": "^2.5|^3.0" + "symfony/translation-contracts": "^2.5.3|^3.3" }, "conflict": { - "symfony/config": "<5.4", - "symfony/console": "<5.4", - "symfony/dependency-injection": "<5.4", + "nikic/php-parser": "<5.0", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<5.4", + "symfony/http-kernel": "<6.4", "symfony/service-contracts": "<2.5", - "symfony/twig-bundle": "<5.4", - "symfony/yaml": "<5.4" + "symfony/twig-bundle": "<6.4", + "symfony/yaml": "<6.4" }, "provide": { "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", "symfony/http-client-contracts": "^2.5|^3.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/routing": "^6.4|^7.0|^8.0", "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -6633,7 +6467,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v6.4.34" + "source": "https://github.com/symfony/translation/tree/v7.4.6" }, "funding": [ { @@ -6653,7 +6487,7 @@ "type": "tidelift" } ], - "time": "2026-02-16T20:44:03+00:00" + "time": "2026-02-17T07:53:42+00:00" }, { "name": "symfony/translation-contracts", @@ -6739,68 +6573,70 @@ }, { "name": "symfony/twig-bridge", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "5169074f4a88dfb02eeccddaba78edfdf212a9b2" + "reference": "c67219ca6b79a57b64e36bbb2cd8ba741286587e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/5169074f4a88dfb02eeccddaba78edfdf212a9b2", - "reference": "5169074f4a88dfb02eeccddaba78edfdf212a9b2", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/c67219ca6b79a57b64e36bbb2cd8ba741286587e", + "reference": "c67219ca6b79a57b64e36bbb2cd8ba741286587e", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/translation-contracts": "^2.5|^3", - "twig/twig": "^2.13|^3.0.4" + "twig/twig": "^3.21" }, "conflict": { - "phpdocumentor/reflection-docblock": "<3.2.2", - "phpdocumentor/type-resolver": "<1.4.0", - "symfony/console": "<5.4", - "symfony/form": "<6.4.32|>7,<7.3.10|>7.4,<7.4.4", - "symfony/http-foundation": "<5.4", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/console": "<6.4", + "symfony/form": "<6.4.32|>7,<7.3.10|>7.4,<7.4.4|>8.0,<8.0.4", + "symfony/http-foundation": "<6.4", "symfony/http-kernel": "<6.4", - "symfony/mime": "<6.2", + "symfony/mime": "<6.4", "symfony/serializer": "<6.4", - "symfony/translation": "<5.4", - "symfony/workflow": "<5.4" + "symfony/translation": "<6.4", + "symfony/workflow": "<6.4" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3|^4", "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/asset-mapper": "^6.3|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/form": "^6.4.32|~7.3.10|^7.4.4", - "symfony/html-sanitizer": "^6.1|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/mime": "^6.2|^7.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/asset-mapper": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/form": "^6.4.32|~7.3.10|^7.4.4|^8.0.4", + "symfony/html-sanitizer": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^7.3|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", "symfony/polyfill-intl-icu": "~1.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", "symfony/security-acl": "^2.8|^3.0", - "symfony/security-core": "^5.4|^6.0|^7.0", - "symfony/security-csrf": "^5.4|^6.0|^7.0", - "symfony/security-http": "^5.4|^6.0|^7.0", - "symfony/serializer": "^6.4.3|^7.0.3", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^6.1|^7.0", - "symfony/web-link": "^5.4|^6.0|^7.0", - "symfony/workflow": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0", - "twig/cssinliner-extra": "^2.12|^3", - "twig/inky-extra": "^2.12|^3", - "twig/markdown-extra": "^2.12|^3" + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/security-csrf": "^6.4|^7.0|^8.0", + "symfony/security-http": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4.3|^7.0.3|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/validator": "^6.4|^7.0|^8.0", + "symfony/web-link": "^6.4|^7.0|^8.0", + "symfony/workflow": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0", + "twig/cssinliner-extra": "^3", + "twig/inky-extra": "^3", + "twig/markdown-extra": "^3" }, "type": "symfony-bridge", "autoload": { @@ -6828,7 +6664,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v6.4.34" + "source": "https://github.com/symfony/twig-bridge/tree/v7.4.7" }, "funding": [ { @@ -6848,47 +6684,49 @@ "type": "tidelift" } ], - "time": "2026-02-23T18:17:33+00:00" + "time": "2026-03-04T15:37:05+00:00" }, { "name": "symfony/twig-bundle", - "version": "v6.4.32", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "a5c8dcc11a5bf9c96320da20070d2e158a4e0b30" + "reference": "e8829e02ff96a391ed0703bac9e7ff0537480b6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/a5c8dcc11a5bf9c96320da20070d2e158a4e0b30", - "reference": "a5c8dcc11a5bf9c96320da20070d2e158a4e0b30", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/e8829e02ff96a391ed0703bac9e7ff0537480b6b", + "reference": "e8829e02ff96a391ed0703bac9e7ff0537480b6b", "shasum": "" }, "require": { "composer-runtime-api": ">=2.1", - "php": ">=8.1", - "symfony/config": "^6.1|^7.0", - "symfony/dependency-injection": "^6.1|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^6.2", - "symfony/twig-bridge": "^6.4", - "twig/twig": "^2.13|^3.0.4" + "php": ">=8.2", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", + "symfony/twig-bridge": "^7.3|^8.0", + "twig/twig": "^3.12" }, "conflict": { - "symfony/framework-bundle": "<5.4", - "symfony/translation": "<5.4" + "symfony/framework-bundle": "<6.4", + "symfony/translation": "<6.4" }, "require-dev": { - "symfony/asset": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/form": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^5.4|^6.0|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4|^6.0|^7.0", - "symfony/web-link": "^5.4|^6.0|^7.0", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/asset": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/form": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4|^7.0|^8.0", + "symfony/web-link": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "symfony-bundle", "autoload": { @@ -6916,7 +6754,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v6.4.32" + "source": "https://github.com/symfony/twig-bundle/tree/v7.4.4" }, "funding": [ { @@ -6936,24 +6774,107 @@ "type": "tidelift" } ], - "time": "2026-01-05T12:44:39+00:00" + "time": "2026-01-06T12:34:24+00:00" + }, + { + "name": "symfony/type-info", + "version": "v7.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "31f1e40cbf7851c7354281c90eb1b352c4cb8269" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/31f1e40cbf7851c7354281c90eb1b352c4cb8269", + "reference": "31f1e40cbf7851c7354281c90eb1b352c4cb8269", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.30|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v7.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-04T12:49:16+00:00" }, { "name": "symfony/validator", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "7c3897b7f739d4ab913481e680405ca82d08084d" + "reference": "3a1a460a9f8c5e5611e15c52c4baa5a62fa3c203" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/7c3897b7f739d4ab913481e680405ca82d08084d", - "reference": "7c3897b7f739d4ab913481e680405ca82d08084d", + "url": "https://api.github.com/repos/symfony/validator/zipball/3a1a460a9f8c5e5611e15c52c4baa5a62fa3c203", + "reference": "3a1a460a9f8c5e5611e15c52c4baa5a62fa3c203", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0", @@ -6961,34 +6882,37 @@ "symfony/translation-contracts": "^2.5|^3" }, "conflict": { - "doctrine/annotations": "<1.13", "doctrine/lexer": "<1.1", - "symfony/dependency-injection": "<5.4", - "symfony/expression-language": "<5.4", - "symfony/http-kernel": "<5.4", - "symfony/intl": "<5.4", - "symfony/property-info": "<5.4", - "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3", - "symfony/yaml": "<5.4" + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<7.0", + "symfony/expression-language": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/intl": "<6.4", + "symfony/property-info": "<6.4", + "symfony/translation": "<6.4.3|>=7.0,<7.0.3", + "symfony/var-exporter": "<6.4.25|>=7.0,<7.3.3", + "symfony/yaml": "<6.4" }, "require-dev": { - "doctrine/annotations": "^1.13|^2", "egulias/email-validator": "^2.1.10|^3|^4", - "symfony/cache": "^5.4|^6.0|^7.0", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/expression-language": "^5.4|^6.0|^7.0", - "symfony/finder": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/http-foundation": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/intl": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/property-access": "^5.4|^6.0|^7.0", - "symfony/property-info": "^5.4|^6.0|^7.0", - "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3", - "symfony/yaml": "^5.4|^6.0|^7.0" + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/expression-language": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/property-info": "^6.4|^7.0|^8.0", + "symfony/string": "^6.4|^7.0|^8.0", + "symfony/translation": "^6.4.3|^7.0.3|^8.0", + "symfony/type-info": "^7.1.8", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7017,7 +6941,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v6.4.34" + "source": "https://github.com/symfony/validator/tree/v7.4.7" }, "funding": [ { @@ -7037,37 +6961,36 @@ "type": "tidelift" } ], - "time": "2026-02-23T17:49:24+00:00" + "time": "2026-03-06T11:10:17+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.32", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "131fc9915e0343052af5ed5040401b481ca192aa" + "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/131fc9915e0343052af5ed5040401b481ca192aa", - "reference": "131fc9915e0343052af5ed5040401b481ca192aa", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291", + "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/error-handler": "^6.3|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/uid": "^5.4|^6.0|^7.0", - "twig/twig": "^2.13|^3.0.4" + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/uid": "^6.4|^7.0|^8.0", + "twig/twig": "^3.12" }, "bin": [ "Resources/bin/var-dump-server" @@ -7105,7 +7028,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.32" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.6" }, "funding": [ { @@ -7125,30 +7048,30 @@ "type": "tidelift" } ], - "time": "2026-01-01T13:34:06+00:00" + "time": "2026-02-15T10:53:20+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.26", + "version": "v7.4.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc" + "reference": "03a60f169c79a28513a78c967316fbc8bf17816f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/466fcac5fa2e871f83d31173f80e9c2684743bfc", - "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/03a60f169c79a28513a78c967316fbc8bf17816f", + "reference": "03a60f169c79a28513a78c967316fbc8bf17816f", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" + "symfony/property-access": "^6.4|^7.0|^8.0", + "symfony/serializer": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -7186,7 +7109,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.26" + "source": "https://github.com/symfony/var-exporter/tree/v7.4.0" }, "funding": [ { @@ -7206,32 +7129,32 @@ "type": "tidelift" } ], - "time": "2025-09-11T09:57:09+00:00" + "time": "2025-09-11T10:15:23+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "7bca30dabed7900a08c5ad4f1d6483f881a64d0f" + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/7bca30dabed7900a08c5ad4f1d6483f881a64d0f", - "reference": "7bca30dabed7900a08c5ad4f1d6483f881a64d0f", + "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { - "symfony/console": "<5.4" + "symfony/console": "<6.4" }, "require-dev": { - "symfony/console": "^5.4|^6.0|^7.0" + "symfony/console": "^6.4|^7.0|^8.0" }, "bin": [ "Resources/bin/yaml-lint" @@ -7262,7 +7185,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.34" + "source": "https://github.com/symfony/yaml/tree/v7.4.6" }, "funding": [ { @@ -7282,7 +7205,7 @@ "type": "tidelift" } ], - "time": "2026-02-06T18:32:11+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { "name": "twig/twig", @@ -8276,16 +8199,16 @@ }, { "name": "ingenerator/behat-tableassert", - "version": "v1.3.2", + "version": "v1.3.3", "source": { "type": "git", "url": "https://github.com/ingenerator/behat-tableassert.git", - "reference": "1aaba36c15fabc7fdf403baf1ff9d4a15a3ce86b" + "reference": "bfe4016ba718ce572049b9b1e4334187942ae380" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ingenerator/behat-tableassert/zipball/1aaba36c15fabc7fdf403baf1ff9d4a15a3ce86b", - "reference": "1aaba36c15fabc7fdf403baf1ff9d4a15a3ce86b", + "url": "https://api.github.com/repos/ingenerator/behat-tableassert/zipball/bfe4016ba718ce572049b9b1e4334187942ae380", + "reference": "bfe4016ba718ce572049b9b1e4334187942ae380", "shasum": "" }, "require": { @@ -8325,7 +8248,7 @@ "issues": "https://github.com/ingenerator/behat-tableassert/issues", "source": "https://github.com/ingenerator/behat-tableassert/" }, - "time": "2025-05-06T09:34:08+00:00" + "time": "2026-03-10T11:59:00+00:00" }, { "name": "league/flysystem", @@ -11285,27 +11208,28 @@ }, { "name": "symfony/browser-kit", - "version": "v6.4.32", + "version": "v7.4.4", "source": { "type": "git", "url": "https://github.com/symfony/browser-kit.git", - "reference": "f49947cf0cbd7d685281ef74e05b98f5e75b181f" + "reference": "bed167eadaaba641f51fc842c9227aa5e251309e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/browser-kit/zipball/f49947cf0cbd7d685281ef74e05b98f5e75b181f", - "reference": "f49947cf0cbd7d685281ef74e05b98f5e75b181f", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/bed167eadaaba641f51fc842c9227aa5e251309e", + "reference": "bed167eadaaba641f51fc842c9227aa5e251309e", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/dom-crawler": "^5.4|^6.0|^7.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/dom-crawler": "^6.4|^7.0|^8.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/http-client": "^5.4|^6.0|^7.0", - "symfony/mime": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0" + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/mime": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -11333,7 +11257,7 @@ "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/browser-kit/tree/v6.4.32" + "source": "https://github.com/symfony/browser-kit/tree/v7.4.4" }, "funding": [ { @@ -11353,24 +11277,24 @@ "type": "tidelift" } ], - "time": "2026-01-13T10:09:10+00:00" + "time": "2026-01-13T10:40:19+00:00" }, { "name": "symfony/css-selector", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "b0314c186f1464de048cce58979ff1625ca88bbb" + "reference": "2e7c52c647b406e2107dd867db424a4dbac91864" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/b0314c186f1464de048cce58979ff1625ca88bbb", - "reference": "b0314c186f1464de048cce58979ff1625ca88bbb", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/2e7c52c647b406e2107dd867db424a4dbac91864", + "reference": "2e7c52c647b406e2107dd867db424a4dbac91864", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -11402,7 +11326,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v6.4.34" + "source": "https://github.com/symfony/css-selector/tree/v7.4.6" }, "funding": [ { @@ -11422,37 +11346,34 @@ "type": "tidelift" } ], - "time": "2026-02-16T08:37:21+00:00" + "time": "2026-02-17T07:53:42+00:00" }, { "name": "symfony/debug-bundle", - "version": "v6.4.27", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/debug-bundle.git", - "reference": "21a61c55192d558a6b81cdb12e8c010fc9474fe0" + "reference": "7affd8924ef9a7739ec53284c2fc30afeeae7124" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/21a61c55192d558a6b81cdb12e8c010fc9474fe0", - "reference": "21a61c55192d558a6b81cdb12e8c010fc9474fe0", + "url": "https://api.github.com/repos/symfony/debug-bundle/zipball/7affd8924ef9a7739ec53284c2fc30afeeae7124", + "reference": "7affd8924ef9a7739ec53284c2fc30afeeae7124", "shasum": "" }, "require": { + "composer-runtime-api": ">=2.1", "ext-xml": "*", - "php": ">=8.1", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/twig-bridge": "^5.4|^6.0|^7.0", - "symfony/var-dumper": "^5.4|^6.0|^7.0" - }, - "conflict": { - "symfony/config": "<5.4", - "symfony/dependency-injection": "<5.4" + "php": ">=8.2", + "symfony/config": "^7.3|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/twig-bridge": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "require-dev": { - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/web-profiler-bundle": "^5.4|^6.0|^7.0" + "symfony/web-profiler-bundle": "^6.4|^7.0|^8.0" }, "type": "symfony-bundle", "autoload": { @@ -11480,7 +11401,7 @@ "description": "Provides a tight integration of the Symfony VarDumper component and the ServerLogCommand from MonologBridge into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug-bundle/tree/v6.4.27" + "source": "https://github.com/symfony/debug-bundle/tree/v7.4.7" }, "funding": [ { @@ -11500,30 +11421,31 @@ "type": "tidelift" } ], - "time": "2025-10-11T17:35:31+00:00" + "time": "2026-03-03T07:48:48+00:00" }, { "name": "symfony/dom-crawler", - "version": "v6.4.34", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/dom-crawler.git", - "reference": "ec0d22e1b89d5767a44f7abb63a1f1439bd9c735" + "reference": "487ba8fa43da9a8e6503fe939b45ecd96875410e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/ec0d22e1b89d5767a44f7abb63a1f1439bd9c735", - "reference": "ec0d22e1b89d5767a44f7abb63a1f1439bd9c735", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/487ba8fa43da9a8e6503fe939b45ecd96875410e", + "reference": "487ba8fa43da9a8e6503fe939b45ecd96875410e", "shasum": "" }, "require": { "masterminds/html5": "^2.6", - "php": ">=8.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.0" }, "require-dev": { - "symfony/css-selector": "^5.4|^6.0|^7.0" + "symfony/css-selector": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -11551,7 +11473,7 @@ "description": "Eases DOM navigation for HTML and XML documents", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dom-crawler/tree/v6.4.34" + "source": "https://github.com/symfony/dom-crawler/tree/v7.4.6" }, "funding": [ { @@ -11571,24 +11493,24 @@ "type": "tidelift" } ], - "time": "2026-02-16T20:44:03+00:00" + "time": "2026-02-17T07:53:42+00:00" }, { "name": "symfony/http-client", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "0dc71f52e5d35bb045fd0f82b1a80c027971d551" + "reference": "1010624285470eb60e88ed10035102c75b4ea6af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/0dc71f52e5d35bb045fd0f82b1a80c027971d551", - "reference": "0dc71f52e5d35bb045fd0f82b1a80c027971d551", + "url": "https://api.github.com/repos/symfony/http-client/zipball/1010624285470eb60e88ed10035102c75b4ea6af", + "reference": "1010624285470eb60e88ed10035102c75b4ea6af", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.2", "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-client-contracts": "~3.4.4|^3.5.2", @@ -11596,8 +11518,10 @@ "symfony/service-contracts": "^2.5|^3" }, "conflict": { + "amphp/amp": "<2.5", + "amphp/socket": "<1.1", "php-http/discovery": "<1.15", - "symfony/http-foundation": "<6.3" + "symfony/http-foundation": "<6.4" }, "provide": { "php-http/async-client-implementation": "*", @@ -11606,19 +11530,20 @@ "symfony/http-client-implementation": "3.0" }, "require-dev": { - "amphp/amp": "^2.5", - "amphp/http-client": "^4.2.1", - "amphp/http-tunnel": "^1.0", - "amphp/socket": "^1.1", + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", "guzzlehttp/promises": "^1.4|^2.0", "nyholm/psr7": "^1.0", "php-http/httplug": "^1.0|^2.0", "psr/http-client": "^1.0", - "symfony/dependency-injection": "^5.4|^6.0|^7.0", - "symfony/http-kernel": "^5.4|^6.0|^7.0", - "symfony/messenger": "^5.4|^6.0|^7.0", - "symfony/process": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/cache": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/rate-limiter": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -11649,7 +11574,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v6.4.34" + "source": "https://github.com/symfony/http-client/tree/v7.4.7" }, "funding": [ { @@ -11669,7 +11594,7 @@ "type": "tidelift" } ], - "time": "2026-02-18T07:27:25+00:00" + "time": "2026-03-05T11:16:58+00:00" }, { "name": "symfony/http-client-contracts", @@ -11751,16 +11676,16 @@ }, { "name": "symfony/phpunit-bridge", - "version": "v7.4.3", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/phpunit-bridge.git", - "reference": "f933e68bb9df29d08077a37e1515a23fea8562ab" + "reference": "53c5a606cb4ae19c9466a5f8ffe60f61b0c93b5f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/f933e68bb9df29d08077a37e1515a23fea8562ab", - "reference": "f933e68bb9df29d08077a37e1515a23fea8562ab", + "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/53c5a606cb4ae19c9466a5f8ffe60f61b0c93b5f", + "reference": "53c5a606cb4ae19c9466a5f8ffe60f61b0c93b5f", "shasum": "" }, "require": { @@ -11812,7 +11737,7 @@ "testing" ], "support": { - "source": "https://github.com/symfony/phpunit-bridge/tree/v7.4.3" + "source": "https://github.com/symfony/phpunit-bridge/tree/v7.4.7" }, "funding": [ { @@ -11832,42 +11757,46 @@ "type": "tidelift" } ], - "time": "2025-12-09T15:33:45+00:00" + "time": "2026-03-04T13:54:41+00:00" }, { "name": "symfony/web-profiler-bundle", - "version": "v6.4.34", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/web-profiler-bundle.git", - "reference": "848bc5d5745500f855bb201d57ae066fd7e67448" + "reference": "da9e91746fc9c575be8b5ff466b7572d98e7e1ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/848bc5d5745500f855bb201d57ae066fd7e67448", - "reference": "848bc5d5745500f855bb201d57ae066fd7e67448", + "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/da9e91746fc9c575be8b5ff466b7572d98e7e1ae", + "reference": "da9e91746fc9c575be8b5ff466b7572d98e7e1ae", "shasum": "" }, "require": { - "php": ">=8.1", - "symfony/config": "^5.4|^6.0|^7.0", - "symfony/framework-bundle": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/routing": "^5.4|^6.0|^7.0", - "symfony/twig-bundle": "^5.4|^6.0", - "twig/twig": "^2.13|^3.0.4" + "composer-runtime-api": ">=2.1", + "php": ">=8.2", + "symfony/config": "^7.3|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/framework-bundle": "^6.4.13|^7.1.6|^8.0", + "symfony/http-kernel": "^6.4.13|^7.1.6|^8.0", + "symfony/routing": "^6.4|^7.0|^8.0", + "symfony/twig-bundle": "^6.4|^7.0|^8.0", + "twig/twig": "^3.15" }, "conflict": { - "symfony/form": "<5.4", - "symfony/mailer": "<5.4", - "symfony/messenger": "<5.4", - "symfony/twig-bundle": ">=7.0" + "symfony/form": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/serializer": "<7.2", + "symfony/workflow": "<7.3" }, "require-dev": { - "symfony/browser-kit": "^5.4|^6.0|^7.0", - "symfony/console": "^5.4|^6.0|^7.0", - "symfony/css-selector": "^5.4|^6.0|^7.0", - "symfony/stopwatch": "^5.4|^6.0|^7.0" + "symfony/browser-kit": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/css-selector": "^6.4|^7.0|^8.0", + "symfony/runtime": "^6.4.13|^7.1.6|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0" }, "type": "symfony-bundle", "autoload": { @@ -11898,7 +11827,7 @@ "dev" ], "support": { - "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.34" + "source": "https://github.com/symfony/web-profiler-bundle/tree/v7.4.7" }, "funding": [ { @@ -11918,7 +11847,7 @@ "type": "tidelift" } ], - "time": "2026-02-05T15:19:06+00:00" + "time": "2026-03-03T13:57:00+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index caa50b9783..a3503488f5 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -17,7 +17,6 @@ framework: - '%kernel.project_dir%/languages' - '%kernel.project_dir%/theme/base/translations' - '%kernel.project_dir%/theme/%theme.name%/translations' - form: ~ csrf_protection: ~ validation: { enable_attributes: true, diff --git a/config/packages/property_info.yaml b/config/packages/property_info.yaml new file mode 100644 index 0000000000..dd31b9da22 --- /dev/null +++ b/config/packages/property_info.yaml @@ -0,0 +1,3 @@ +framework: + property_info: + with_constructor_extractor: true diff --git a/config/packages/test/config.yaml b/config/packages/test/config.yaml index 76b7fb3ad2..31c1b9a716 100644 --- a/config/packages/test/config.yaml +++ b/config/packages/test/config.yaml @@ -6,11 +6,10 @@ services: engineblock.twig.extension.global_site_notice: class: OpenConext\EngineBlockBundle\Twig\Extensions\Extension\FunctionalTestingGlobalSiteNotice + autoconfigure: true arguments: - "@request_stack" - "%global.site_notice.allowed.tags%" - tags: - - { name: 'twig.extension' } web_profiler: toolbar: false diff --git a/config/routes/ci/routing.yml b/config/routes/ci/routing.yml index a0f813cadf..6b8ce6bde9 100644 --- a/config/routes/ci/routing.yml +++ b/config/routes/ci/routing.yml @@ -1,13 +1,13 @@ _wdt: - resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml" + resource: "@WebProfilerBundle/Resources/config/routing/wdt.php" prefix: /_wdt _profiler: - resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml" + resource: "@WebProfilerBundle/Resources/config/routing/profiler.php" prefix: /_profiler _errors: - resource: '@FrameworkBundle/Resources/config/routing/errors.xml' + resource: '@FrameworkBundle/Resources/config/routing/errors.php' prefix: /_error _functional_testing: diff --git a/config/routes/dev/routing.yaml b/config/routes/dev/routing.yaml index 0c051d2ea5..7b04d163f7 100644 --- a/config/routes/dev/routing.yaml +++ b/config/routes/dev/routing.yaml @@ -1,11 +1,11 @@ _wdt: - resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml" + resource: "@WebProfilerBundle/Resources/config/routing/wdt.php" prefix: /_wdt _profiler: - resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml" + resource: "@WebProfilerBundle/Resources/config/routing/profiler.php" prefix: /_profiler _errors: - resource: '@FrameworkBundle/Resources/config/routing/errors.xml' + resource: '@FrameworkBundle/Resources/config/routing/errors.php' prefix: /_error diff --git a/config/services/ci/services.yml b/config/services/ci/services.yml index d7a6a75f4e..4c7f06c5f9 100644 --- a/config/services/ci/services.yml +++ b/config/services/ci/services.yml @@ -132,8 +132,7 @@ services: - '%stepup.sfo.override_engine_entityid%' OpenConext\EngineBlockBundle\Twig\Extensions\Extension\FunctionalTestingGlobalSiteNotice: + autoconfigure: true arguments: - "@request_stack" - "%global.site_notice.allowed.tags%" - tags: - - { name: 'twig.extension' } diff --git a/config/services/services.yml b/config/services/services.yml index 9cecb712ef..a3f81ab354 100644 --- a/config/services/services.yml +++ b/config/services/services.yml @@ -24,8 +24,7 @@ services: - { name: openconext.monitor.health_check } OpenConext\EngineBlockBundle\Twig\Extensions\Extension\Spaceless: - tags: - - { name: 'twig.extension' } + autoconfigure: true OpenConext\EngineBlockBundle\Value\ExecutionTime: factory: [ OpenConext\EngineBlockBundle\Value\ExecutionTime, 'of' ] @@ -296,53 +295,46 @@ services: - '@OpenConext\EngineBlock\Metadata\MetadataRepository\CachedDoctrineMetadataRepository' OpenConext\EngineBlockBundle\Twig\Extensions\Extension\Debug: - tags: - - { name: 'twig.extension' } + autoconfigure: true OpenConext\EngineBlockBundle\Twig\Extensions\Extension\Feedback: + autoconfigure: true arguments: - '@engineblock.compat.application' - '@OpenConext\EngineBlockBundle\Configuration\ErrorFeedbackConfiguration' - '@engineblock.compat.repository.metadata' - '@OpenConext\EngineBlockBundle\Authentication\Service\SamlResponseHelper' - tags: - - { name: 'twig.extension' } OpenConext\EngineBlockBundle\Twig\Extensions\Extension\GlobalSiteNotice: + autoconfigure: true arguments: - '%global.site_notice.show%' - '%global.site_notice.allowed.tags%' - '@translator' - tags: - - { name: 'twig.extension' } OpenConext\EngineBlockBundle\Twig\Extensions\Extension\I18n: + autoconfigure: true arguments: - '@translator' - tags: - - { name: 'twig.extension' } OpenConext\EngineBlockBundle\Twig\Extensions\Extension\Locale: + autoconfigure: true arguments: - '@request_stack' - '@OpenConext\EngineBlockBundle\Localization\LanguageSupportProvider' - '%locale%' - tags: - - { name: 'twig.extension' } OpenConext\EngineBlockBundle\Twig\Extensions\Extension\Metadata: + autoconfigure: true arguments: - '@engineblock.compat.metadata.definitions' - '@translator' - tags: - - { name: 'twig.extension' } OpenConext\EngineBlockBundle\Twig\Extensions\Extension\Wayf: + autoconfigure: true arguments: - '@request_stack' - '@translator' - tags: - - { name: 'twig.extension' } OpenConext\EngineBlockBundle\Service\DiscoverySelectionService: diff --git a/library/EngineBlock/ApplicationSingleton.php b/library/EngineBlock/ApplicationSingleton.php index 5b2144e529..00f7948351 100644 --- a/library/EngineBlock/ApplicationSingleton.php +++ b/library/EngineBlock/ApplicationSingleton.php @@ -23,6 +23,7 @@ use OpenConext\EngineBlockBundle\Exception\Art; use Psr\Log\LoggerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; +use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException; define('ENGINEBLOCK_FOLDER_ROOT' , realpath(__DIR__ . '/../../') . '/'); define('ENGINEBLOCK_FOLDER_LIBRARY' , ENGINEBLOCK_FOLDER_ROOT . 'library/'); @@ -235,8 +236,12 @@ public function reportError(Throwable $exception, $messageSuffix = '') $log->log($severity, $message, $logContext); // Store some valuable debug info in session so it can be displayed on feedback pages - @session_start(); - $this->getSession()->set('feedbackInfo', $this->collectFeedbackInfo($exception)); + try { + @session_start(); + $this->getSession()->set('feedbackInfo', $this->collectFeedbackInfo($exception)); + } catch (SessionNotFoundException $e) { + // No active session (e.g. CLI context or recursive error during boot); skip session write + } // flush all messages in queue, something went wrong! $this->flushLog('An error was caught'); @@ -350,7 +355,11 @@ public function handleExceptionWithFeedback( { $messageSuffix = '-> Redirecting to feedback page'; $this->reportError($exception, $messageSuffix); - $this->getSession()->set('feedbackInfo', array_merge($feedbackInfo, $this->getSession()->get('feedbackInfo', []))); + try { + $this->getSession()->set('feedbackInfo', array_merge($feedbackInfo, $this->getSession()->get('feedbackInfo', []))); + } catch (SessionNotFoundException $e) { + // No active session (e.g. CLI or recursive error); skip session merge + } $this->getHttpResponse()->setRedirectUrl($feedbackUrl); } diff --git a/library/EngineBlock/Corto/Module/Service/ProvideConsent.php b/library/EngineBlock/Corto/Module/Service/ProvideConsent.php index 767650ae83..7197084c46 100644 --- a/library/EngineBlock/Corto/Module/Service/ProvideConsent.php +++ b/library/EngineBlock/Corto/Module/Service/ProvideConsent.php @@ -139,9 +139,6 @@ public function serve($serviceName, Request $httpRequest) $authenticationState = $this->_authenticationStateHelper->getAuthenticationState(); $session = $httpRequest->getSession(); - if($session === null){ - throw new EngineBlock_Exception('Discovery override failure: No session available.'); - } $idpDiscovery = $this->discoverySelectionService->getDiscoveryFromRequest($session, $identityProvider); diff --git a/src/Kernel.php b/src/Kernel.php index 24e915389e..35c0dccaf6 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -20,8 +20,8 @@ use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; use Symfony\Component\Config\Loader\LoaderInterface; -use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; use Symfony\Component\HttpKernel\Kernel as BaseKernel; use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; use function dirname; @@ -47,16 +47,14 @@ public function getProjectDir(): string return dirname(__DIR__); } - protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void + protected function configureContainer(ContainerConfigurator $container, LoaderInterface $loader, ContainerBuilder $builder): void { - $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php')); - $confDir = $this->getProjectDir().'/config'; - $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{packages}/'.$this->environment.'/*'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob'); - $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob'); + $container->import($confDir.'/{packages}/*'.self::CONFIG_EXTS); + $container->import($confDir.'/{packages}/'.$this->environment.'/*'.self::CONFIG_EXTS); + $container->import($confDir.'/{services}'.self::CONFIG_EXTS); + $container->import($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS); } protected function configureRoutes(RoutingConfigurator $routes): void diff --git a/src/OpenConext/EngineBlock/Service/AuthenticationStateHelper.php b/src/OpenConext/EngineBlock/Service/AuthenticationStateHelper.php index aea65ee164..bf18329bc6 100644 --- a/src/OpenConext/EngineBlock/Service/AuthenticationStateHelper.php +++ b/src/OpenConext/EngineBlock/Service/AuthenticationStateHelper.php @@ -20,18 +20,17 @@ use OpenConext\EngineBlockBundle\Authentication\AuthenticationStateInterface; use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpFoundation\Session\SessionInterface; class AuthenticationStateHelper implements AuthenticationStateHelperInterface { /** - * @var SessionInterface + * @var RequestStack */ - private $session; + private $requestStack; public function __construct(RequestStack $requestStack) { - $this->session = $requestStack->getSession(); + $this->requestStack = $requestStack; } /** @@ -39,6 +38,6 @@ public function __construct(RequestStack $requestStack) */ public function getAuthenticationState() { - return $this->session->get('authentication_state'); + return $this->requestStack->getSession()->get('authentication_state'); } } diff --git a/src/OpenConext/EngineBlock/Service/ProcessingStateHelper.php b/src/OpenConext/EngineBlock/Service/ProcessingStateHelper.php index 03a4802a1a..7ebc944403 100644 --- a/src/OpenConext/EngineBlock/Service/ProcessingStateHelper.php +++ b/src/OpenConext/EngineBlock/Service/ProcessingStateHelper.php @@ -32,13 +32,18 @@ class ProcessingStateHelper implements ProcessingStateHelperInterface const SESSION_KEY = 'Processing'; /** - * @var SessionInterface + * @var RequestStack */ - private $session; + private $requestStack; public function __construct(RequestStack $requestStack) { - $this->session = $requestStack->getSession(); + $this->requestStack = $requestStack; + } + + private function session(): SessionInterface + { + return $this->requestStack->getSession(); } /** @@ -56,9 +61,9 @@ public function addStep( ) { // Add the additional checks to the session $processingStep = new ProcessingStateStep($response, $role); - $processing = $this->session->get(self::SESSION_KEY); + $processing = $this->session()->get(self::SESSION_KEY); $processing[$requestId][$name] = $processingStep; - $this->session->set(self::SESSION_KEY, $processing); + $this->session()->set(self::SESSION_KEY, $processing); return $processingStep; } @@ -72,7 +77,7 @@ public function addStep( */ public function getStepByRequestId($requestId, $name) { - $processing = $this->session->get(self::SESSION_KEY); + $processing = $this->session()->get(self::SESSION_KEY); if (empty($processing)) { throw new EngineBlock_Corto_Module_Services_SessionLostException('Session lost'); } @@ -92,7 +97,7 @@ public function getStepByRequestId($requestId, $name) public function hasStepRequestById(string $requestId, string $name): bool { - $processing = $this->session->get(self::SESSION_KEY); + $processing = $this->session()->get(self::SESSION_KEY); if (empty($processing)) { return false; } @@ -119,11 +124,11 @@ public function updateStepResponseByRequestId( $name, EngineBlock_Saml2_ResponseAnnotationDecorator $response ) { - $processing = $this->session->get(self::SESSION_KEY); + $processing = $this->session()->get(self::SESSION_KEY); $processingStep = $this->getStepByRequestId($requestId, $name); $updatedProcessingStep = new ProcessingStateStep($response, $processingStep->getRole()); $processing[$requestId][$name] = $updatedProcessingStep; - $this->session->set(self::SESSION_KEY, $processing); + $this->session()->set(self::SESSION_KEY, $processing); return $updatedProcessingStep; } @@ -135,7 +140,7 @@ public function updateStepResponseByRequestId( */ public function clearStepByRequestId($requestId) { - $processing = $this->session->get(self::SESSION_KEY); + $processing = $this->session()->get(self::SESSION_KEY); if (empty($processing)) { throw new EngineBlock_Corto_Module_Services_SessionLostException('Session lost after consent'); } @@ -147,6 +152,6 @@ public function clearStepByRequestId($requestId) unset($processing[$requestId]); - $this->session->set(self::SESSION_KEY, $processing); + $this->session()->set(self::SESSION_KEY, $processing); } } diff --git a/src/OpenConext/EngineBlockBridge/ErrorReporter.php b/src/OpenConext/EngineBlockBridge/ErrorReporter.php index 8ad4f2d1bf..6e44b26acb 100644 --- a/src/OpenConext/EngineBlockBridge/ErrorReporter.php +++ b/src/OpenConext/EngineBlockBridge/ErrorReporter.php @@ -24,8 +24,8 @@ use EngineBlock_Exception; use Exception; use Psr\Log\LoggerInterface; +use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException; use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpFoundation\Session\SessionInterface; class ErrorReporter { @@ -38,9 +38,9 @@ class ErrorReporter */ private $engineBlockApplicationSingleton; /** - * @var SessionInterface + * @var RequestStack */ - private $session; + private $requestStack; public function __construct( EngineBlock_ApplicationSingleton $engineBlockApplicationSingleton, @@ -49,63 +49,63 @@ public function __construct( ) { $this->engineBlockApplicationSingleton = $engineBlockApplicationSingleton; $this->logger = $logger; - $this->session = $requestStack->getSession(); + $this->requestStack = $requestStack; } - /** - * @param Exception $exception - * @param string $messageSuffix - */ - public function reportError(Exception $exception, $messageSuffix) + public function reportError(Exception $exception, string $messageSuffix): void { - $logContext = ['exception' => $exception]; + $logContext = $this->buildLogContext($exception); + $severity = $exception instanceof EngineBlock_Exception + ? $exception->getSeverity() + : EngineBlock_Exception::CODE_ERROR; - if ($exception instanceof EngineBlock_Exception) { - $severity = $exception->getSeverity(); - } else { - $severity = EngineBlock_Exception::CODE_ERROR; + $message = $exception->getMessage() ?: 'Exception without message "' . get_class($exception) . '"'; + if ($messageSuffix) { + $message .= ' | ' . $messageSuffix; } - // unwrap the exception stack - $prevException = $exception; - while ($prevException = $prevException->getPrevious()) { - if (!isset($logContext['previous_exceptions'])) { - $logContext['previous_exceptions'] = []; - } + $this->logger->log($severity, $message, $logContext); - $logContext['previous_exceptions'][] = (string)$prevException; + try { + $this->storeSessionFeedback($exception); + } finally { + // flush all messages in queue, something went wrong! + $this->engineBlockApplicationSingleton->flushLog('An error was caught'); } + } - // message building - $message = $exception->getMessage(); - if (empty($message)) { - $message = 'Exception without message "' . get_class($exception) . '"'; - } + private function buildLogContext(Exception $exception): array + { + $logContext = ['exception' => $exception]; + $prevException = $exception; - if ($messageSuffix) { - $message .= ' | ' . $messageSuffix; + // unwrap the exception stack + while ($prevException = $prevException->getPrevious()) { + $logContext['previous_exceptions'][] = (string) $prevException; } - $this->logger->log($severity, $message, $logContext); + return $logContext; + } + private function storeSessionFeedback(Exception $exception): void + { // Store some valuable debug info in session so it can be displayed on feedback pages - $feedback = $this->session->get('feedbackInfo'); - if (empty($feedback)) { - $feedback = []; - } + try { + $session = $this->requestStack->getSession(); + $feedback = $session->get('feedbackInfo') ?: []; + + if ($exception instanceof EngineBlock_Corto_Exception_HasFeedbackInfoInterface) { + $feedback = array_merge($feedback, $exception->getFeedbackInfo()); + } elseif ($exception instanceof EngineBlock_Corto_Exception_PEPNoAccess) { + $session->set('error_authorization_policy_decision', $exception->getPolicyDecision()); + } - if ($exception instanceof EngineBlock_Corto_Exception_HasFeedbackInfoInterface) { - $feedback = array_merge($feedback, $exception->getFeedbackInfo()); - } elseif ($exception instanceof EngineBlock_Corto_Exception_PEPNoAccess) { - $this->session->set('error_authorization_policy_decision', $exception->getPolicyDecision()); + $session->set('feedbackInfo', array_merge( + $feedback, + $this->engineBlockApplicationSingleton->collectFeedbackInfo($exception) + )); + } catch (SessionNotFoundException $e) { + // No active session (e.g. CLI or recursive error during boot); skip session write } - - $this->session->set('feedbackInfo', array_merge( - $feedback, - $this->engineBlockApplicationSingleton->collectFeedbackInfo($exception) - )); - - // flush all messages in queue, something went wrong! - $this->engineBlockApplicationSingleton->flushLog('An error was caught'); } } diff --git a/src/OpenConext/EngineBlockBundle/Controller/DebugController.php b/src/OpenConext/EngineBlockBundle/Controller/DebugController.php index 39d41a2f9e..50af2aa4ce 100644 --- a/src/OpenConext/EngineBlockBundle/Controller/DebugController.php +++ b/src/OpenConext/EngineBlockBundle/Controller/DebugController.php @@ -25,7 +25,6 @@ use OpenConext\Value\Saml\EntityId; use OpenConext\Value\Saml\EntityType; use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\Routing\Attribute\Route; class DebugController implements AuthenticationLoopThrottlingController @@ -36,16 +35,16 @@ class DebugController implements AuthenticationLoopThrottlingController private $engineBlockApplicationSingleton; /** - * @var SessionInterface + * @var RequestStack */ - private $session; + private $requestStack; public function __construct( EngineBlock_ApplicationSingleton $engineBlockApplicationSingleton, RequestStack $requestStack, ) { $this->engineBlockApplicationSingleton = $engineBlockApplicationSingleton; - $this->session = $requestStack->getSession(); + $this->requestStack = $requestStack; } #[Route(path: '/authentication/sp/debug', name: 'authentication_sp_debug', methods: ['GET', 'POST'])] @@ -57,7 +56,7 @@ public function debugSpConnectionAction() // Authentication state needs to be registered here as the debug flow differs from the regular flow, // yet the procedures for both are completed when consuming the assertion in the ServiceProviderController - $authenticationState = $this->session->get('authentication_state'); + $authenticationState = $this->requestStack->getSession()->get('authentication_state'); $requestId = '_00000000-0000-0000-0000-000000000000'; $authenticationState->startAuthenticationOnBehalfOf( diff --git a/src/OpenConext/EngineBlockBundle/Controller/FeedbackController.php b/src/OpenConext/EngineBlockBundle/Controller/FeedbackController.php index da0f48340f..34a8a32af7 100644 --- a/src/OpenConext/EngineBlockBundle/Controller/FeedbackController.php +++ b/src/OpenConext/EngineBlockBundle/Controller/FeedbackController.php @@ -129,7 +129,7 @@ public function unsupportedSignatureMethodAction(Request $request) ->render( '@theme/Authentication/View/Feedback/unsupported-signature-method.html.twig', [ - 'signatureMethod' => $request->get('signature-method') + 'signatureMethod' => $request->query->get('signature-method') ] ), 400 @@ -156,7 +156,7 @@ public function unsupportedAcsLocationSchemeAction() #[Route(path: '/authentication/feedback/unknown-service-provider', name: 'authentication_feedback_unknown_service_provider', methods: ['GET'])] public function unknownServiceProviderAction(Request $request) { - $entityId = $request->get('entity-id'); + $entityId = $request->query->get('entity-id'); // Add feedback info from url $customFeedbackInfo = ['EntityID' => $entityId]; @@ -177,8 +177,8 @@ public function unknownIdentityProviderAction(Request $request) { // Add feedback info from url $customFeedbackInfo = [ - 'EntityID' => $request->get('entity-id'), - 'Destination' => $request->get('destination'), + 'EntityID' => $request->query->get('entity-id'), + 'Destination' => $request->query->get('destination'), ]; $this->setFeedbackInformationOnSession($request->getSession(), $customFeedbackInfo); @@ -406,7 +406,7 @@ public function unknownPreselectedIdpAction(Request $request) { // Add feedback info from url $customFeedbackInfo = [ - 'Idp Hash' => $request->get('idp-hash'), + 'Idp Hash' => $request->query->get('idp-hash'), ]; $this->setFeedbackInformationOnSession($request->getSession(), $customFeedbackInfo); @@ -421,7 +421,7 @@ public function unknownKeyIdAction(Request $request): Response { // Add feedback info from url $customFeedbackInfo = [ - 'Key ID' => $request->get('keyid'), + 'Key ID' => $request->query->get('keyid'), ]; $this->setFeedbackInformationOnSession($request->getSession(), $customFeedbackInfo); diff --git a/src/OpenConext/EngineBlockBundle/EventListener/AuthenticationStateInitializer.php b/src/OpenConext/EngineBlockBundle/EventListener/AuthenticationStateInitializer.php index a7acbe0f25..2115cd0d49 100644 --- a/src/OpenConext/EngineBlockBundle/EventListener/AuthenticationStateInitializer.php +++ b/src/OpenConext/EngineBlockBundle/EventListener/AuthenticationStateInitializer.php @@ -22,19 +22,18 @@ use OpenConext\EngineBlockBundle\Authentication\AuthenticationState; use OpenConext\EngineBlockBundle\Controller\AuthenticationLoopThrottlingController; use Symfony\Component\HttpFoundation\RequestStack; -use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\HttpKernel\Event\ControllerEvent; final class AuthenticationStateInitializer { /** - * @var Session + * @var RequestStack */ - private $session; + private $requestStack; public function __construct(RequestStack $requestStack) { - $this->session = $requestStack->getSession(); + $this->requestStack = $requestStack; } public function onKernelController(ControllerEvent $event): void @@ -48,11 +47,12 @@ public function onKernelController(ControllerEvent $event): void return; } - $authenticationState = $this->session->get('authentication_state'); + $session = $this->requestStack->getSession(); + $authenticationState = $session->get('authentication_state'); if ($authenticationState === null) { $authenticationLoopGuard = $this->getAuthenticationLoopGuard(); - $this->session->set('authentication_state', new AuthenticationState($authenticationLoopGuard)); + $session->set('authentication_state', new AuthenticationState($authenticationLoopGuard)); } } diff --git a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Debug.php b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Debug.php index 55b189b47e..1bdcc91078 100644 --- a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Debug.php +++ b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Debug.php @@ -18,27 +18,19 @@ namespace OpenConext\EngineBlockBundle\Twig\Extensions\Extension; -use Twig\Extension\AbstractExtension; -use Twig\TwigFunction; +use Twig\Attribute\AsTwigFunction; /** * The debug extension is used to provide var_dump, var_export and print_r functions for usage in Twig templates. */ -class Debug extends AbstractExtension +class Debug { - public function getFunctions(): array - { - return [ - new TwigFunction('var_export', $this->varExport(...)), - new TwigFunction('print_r', $this->printHumanReadable(...)), - ]; - } - /** * Provide var export functionality for use in Twig templates * @param mixed $expression * @return string */ + #[AsTwigFunction(name: 'var_export')] public function varExport($expression) { return var_export($expression, true); @@ -49,6 +41,7 @@ public function varExport($expression) * @param mixed $expression * @return string */ + #[AsTwigFunction(name: 'print_r')] public function printHumanReadable($expression) { return print_r($expression, true); diff --git a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Feedback.php b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Feedback.php index e936fa80bc..988ab21863 100644 --- a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Feedback.php +++ b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Feedback.php @@ -26,10 +26,9 @@ use OpenConext\EngineBlockBundle\Value\FeedbackInformation; use OpenConext\EngineBlockBundle\Value\FeedbackInformationMap; use SAML2\XML\saml\Issuer; -use Twig\Extension\AbstractExtension; -use Twig\TwigFunction; +use Twig\Attribute\AsTwigFunction; -class Feedback extends AbstractExtension +class Feedback { /** * @var EngineBlock_ApplicationSingleton @@ -63,23 +62,7 @@ public function __construct( $this->samlResponseHelper = $samlResponseHelper; } - public function getFunctions(): array - { - return [ - new TwigFunction('feedbackInfo', $this->getFeedbackInfo(...)), - new TwigFunction('flushLog', $this->flushLog(...)), - new TwigFunction('hasBackToSpLink', $this->hasBackToSpLink(...)), - new TwigFunction('hasWikiLink', $this->hasWikiLink(...)), - new TwigFunction('getWikiLink', $this->getWikiLink(...)), - new TwigFunction('hasIdPContactMailLink', $this->hasIdPContactMailLink(...)), - new TwigFunction('getIdPContactMailLink', $this->getIdPContactMailLink(...)), - new TwigFunction('getIdpContactShortLabel', $this->getIdpContactShortLabel(...)), - new TwigFunction('getSpName', $this->getSpName(...)), - new TwigFunction('getAcu', $this->getAcu(...)), - new TwigFunction('getSamlFailedResponse', $this->getSamlFailedResponse(...)), - ]; - } - + #[AsTwigFunction(name: 'flushLog')] public function flushLog($message) { // For now use the EngineBlock_ApplicationSingleton to flush the log @@ -89,6 +72,7 @@ public function flushLog($message) /** * @return FeedbackInformationMap */ + #[AsTwigFunction(name: 'feedbackInfo')] public function getFeedbackInfo() { return $this->retrieveFeedbackInfo(); @@ -98,6 +82,7 @@ public function getFeedbackInfo() * @param string $templateName * @return bool */ + #[AsTwigFunction(name: 'hasWikiLink')] public function hasWikiLink($templateName) { return $this->errorFeedbackConfiguration->hasWikiLink($templateName); @@ -107,6 +92,7 @@ public function hasWikiLink($templateName) * @param string $templateName * @return string */ + #[AsTwigFunction(name: 'getWikiLink')] public function getWikiLink($templateName) { return $this->errorFeedbackConfiguration->getWikiLink($templateName); @@ -116,6 +102,7 @@ public function getWikiLink($templateName) * @param string $templateName * @return bool */ + #[AsTwigFunction(name: 'hasIdPContactMailLink')] public function hasIdPContactMailLink($templateName) { return $this->errorFeedbackConfiguration->isIdPContactPage($templateName) && $this->getIdPContactMailLink(); @@ -125,6 +112,7 @@ public function hasIdPContactMailLink($templateName) * @param string $templateName * @return string */ + #[AsTwigFunction(name: 'getIdpContactShortLabel')] public function getIdpContactShortLabel($templateName) { return $this->errorFeedbackConfiguration->getIdpContactShortLabel($templateName); @@ -133,6 +121,7 @@ public function getIdpContactShortLabel($templateName) /** * @return string */ + #[AsTwigFunction(name: 'getIdPContactMailLink')] public function getIdPContactMailLink() { $feedbackInfo = $this->retrieveFeedbackInfo(); @@ -153,6 +142,7 @@ public function getIdPContactMailLink() return ''; } + #[AsTwigFunction(name: 'hasBackToSpLink')] public function hasBackToSpLink(): bool { $info = $this->retrieveFeedbackInfo(); @@ -165,17 +155,20 @@ public function hasBackToSpLink(): bool return $response !== ''; } + #[AsTwigFunction(name: 'getSpName')] public function getSpName(): ?string { return $this->getFeedbackInfo()->get('serviceProviderName') ?? $this->getFeedbackInfo()->get('serviceProvider'); } + #[AsTwigFunction(name: 'getAcu')] public function getAcu(): string { $info = $this->retrieveFeedbackInfo(); return $this->samlResponseHelper->getAcu($info->get('serviceProvider')); } + #[AsTwigFunction(name: 'getSamlFailedResponse')] public function getSamlFailedResponse(): string { $session = $this->application->getSession(); diff --git a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/FunctionalTestingGlobalSiteNotice.php b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/FunctionalTestingGlobalSiteNotice.php index 5d39e0b739..5f282a15a0 100644 --- a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/FunctionalTestingGlobalSiteNotice.php +++ b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/FunctionalTestingGlobalSiteNotice.php @@ -19,10 +19,9 @@ namespace OpenConext\EngineBlockBundle\Twig\Extensions\Extension; use Symfony\Component\HttpFoundation\RequestStack; -use Twig\Extension\AbstractExtension; -use Twig\TwigFunction; +use Twig\Attribute\AsTwigFunction; -class FunctionalTestingGlobalSiteNotice extends AbstractExtension implements GlobalSiteNoticeInterface +class FunctionalTestingGlobalSiteNotice implements GlobalSiteNoticeInterface { private $request; @@ -39,20 +38,13 @@ public function __construct( $this->allowedHtml = $allowedHtml; } - public function getFunctions(): array - { - return [ - new TwigFunction('shouldDisplayGlobalSiteNotice', $this->shouldDisplayGlobalSiteNotice(...)), - new TwigFunction('getGlobalSiteNotice', $this->getGlobalSiteNotice(...)), - new TwigFunction('getAllowedHtmlForNotice', $this->getAllowedHtmlForNotice(...)), - ]; - } - + #[AsTwigFunction(name: 'shouldDisplayGlobalSiteNotice')] public function shouldDisplayGlobalSiteNotice() : bool { return (bool) $this->request->get('showGlobalSiteNotice', false); } + #[AsTwigFunction(name: 'getGlobalSiteNotice')] public function getGlobalSiteNotice(): string { $message = <<request->get('globalSiteNotice', $message); } + #[AsTwigFunction(name: 'getAllowedHtmlForNotice')] public function getAllowedHtmlForNotice(): string { return $this->allowedHtml; diff --git a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/GlobalSiteNotice.php b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/GlobalSiteNotice.php index d0b73aeaa6..2c8dc5a24e 100644 --- a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/GlobalSiteNotice.php +++ b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/GlobalSiteNotice.php @@ -19,10 +19,9 @@ namespace OpenConext\EngineBlockBundle\Twig\Extensions\Extension; use Symfony\Contracts\Translation\TranslatorInterface; -use Twig\Extension\AbstractExtension; -use Twig\TwigFunction; +use Twig\Attribute\AsTwigFunction; -class GlobalSiteNotice extends AbstractExtension +class GlobalSiteNotice { /** * @var bool @@ -49,25 +48,19 @@ public function __construct( $this->translator = $translator; } - public function getFunctions(): array - { - return [ - new TwigFunction('shouldDisplayGlobalSiteNotice', $this->shouldDisplayGlobalSiteNotice(...)), - new TwigFunction('getGlobalSiteNotice', $this->getGlobalSiteNotice(...)), - new TwigFunction('getAllowedHtmlForNotice', $this->getAllowedHtmlForNotice(...)), - ]; - } - + #[AsTwigFunction(name: 'shouldDisplayGlobalSiteNotice')] public function shouldDisplayGlobalSiteNotice() : bool { return $this->shouldDisplayGlobalSiteNotice; } + #[AsTwigFunction(name: 'getGlobalSiteNotice')] public function getGlobalSiteNotice(): string { return $this->translator->trans('site_notice'); } + #[AsTwigFunction(name: 'getAllowedHtmlForNotice')] public function getAllowedHtmlForNotice(): string { return $this->allowedHtml; diff --git a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/I18n.php b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/I18n.php index 72334d18cf..eda4f52f2d 100644 --- a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/I18n.php +++ b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/I18n.php @@ -19,10 +19,9 @@ namespace OpenConext\EngineBlockBundle\Twig\Extensions\Extension; use Symfony\Contracts\Translation\TranslatorInterface; -use Twig\Extension\AbstractExtension; -use Twig\TwigFilter; +use Twig\Attribute\AsTwigFilter; -class I18n extends AbstractExtension +class I18n { /** * @var TranslatorInterface @@ -34,20 +33,14 @@ public function __construct(TranslatorInterface $translator) $this->translator = $translator; } - public function getFilters() - { - return [ - new TwigFilter('trans', $this->translateSingular(...)), - new TwigFilter('transchoice', $this->translatePlural(...)), - ]; - } - + #[AsTwigFilter(name: 'trans')] public function translateSingular($id, array $parameters = [], $domain = null, $locale = null) { $parameters = $this->addDefaultPlaceholders($parameters); return $this->translator->trans($id, $parameters, $domain, $locale); } + #[AsTwigFilter(name: 'transchoice')] public function translatePlural($id, $count, array $parameters = [], $domain = null, $locale = null) { $parameters = $this->addDefaultPlaceholders($parameters); diff --git a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Locale.php b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Locale.php index 062ccfd989..1e10ebc6e1 100644 --- a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Locale.php +++ b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Locale.php @@ -21,14 +21,13 @@ use OpenConext\EngineBlockBundle\Localization\LanguageSupportProvider; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; -use Twig\Extension\AbstractExtension; -use Twig\TwigFunction; +use Twig\Attribute\AsTwigFunction; /** * The Locale extension can be used to retrieve the currently active locale. By default returns the locale that * can be found in the RequestStack. If none can be found in the request stack, the default locale is returned. */ -class Locale extends AbstractExtension +class Locale { /** * @var string @@ -51,17 +50,7 @@ public function __construct(RequestStack $requestStack, LanguageSupportProvider $this->languageSupportProvider = $languageSupportProvider; } - public function getFunctions(): array - { - return [ - new TwigFunction('locale', $this->getLocale(...)), - new TwigFunction('postData', $this->getPostData(...)), - new TwigFunction('queryStringFor', $this->getQueryStringFor(...)), - new TwigFunction('supportedLocales', $this->getSupportedLocales(...)), - - ]; - } - + #[AsTwigFunction(name: 'postData')] public function getPostData() { $postArray = []; @@ -76,6 +65,7 @@ public function getPostData() * @param $locale * @return string */ + #[AsTwigFunction(name: 'queryStringFor')] public function getQueryStringFor($locale) { $params = ['lang' => $locale]; @@ -94,11 +84,13 @@ public function getQueryStringFor($locale) return $query; } + #[AsTwigFunction(name: 'locale')] public function getLocale() { return $this->locale; } + #[AsTwigFunction(name: 'supportedLocales')] public function getSupportedLocales() { return $this->languageSupportProvider->getSupportedLanguages(); diff --git a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Metadata.php b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Metadata.php index 5741bb0c10..3dbf3a6e02 100644 --- a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Metadata.php +++ b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Metadata.php @@ -22,14 +22,13 @@ use OpenConext\Value\Saml\NameIdFormat; use SAML2\XML\saml\NameID; use Symfony\Contracts\Translation\TranslatorInterface; -use Twig\Extension\AbstractExtension; -use Twig\TwigFunction; +use Twig\Attribute\AsTwigFunction; /** * Used to perform certain view related operations on metadata. For example this extension provides a function that * can sort metadata by display order. */ -class Metadata extends AbstractExtension +class Metadata { /** * @var string @@ -47,36 +46,6 @@ public function __construct(EngineBlock_Attributes_Metadata $attributesMetadata, $this->translator = $translator; } - public function getFunctions(): array - { - return [ - new TwigFunction( - 'sortByDisplayOrder', - $this->sortByDisplayOrder(...), - ['is_safe' => ['html']] - ), - new TwigFunction( - 'attributeSourceLogoUrl', - $this->getAttributeSourceLogoUrl(...) - ), - new TwigFunction( - 'attributeSourceDisplayName', - $this->getAttributeSourceDisplayName(...), - ['is_safe' => ['html']] - ), - new TwigFunction( - 'attributeShortName', - $this->getAttributeShortName(...), - ['is_safe' => ['html']] - ), - new TwigFunction( - 'attributeName', - $this->getAttributeName(...), - ['is_safe' => ['html']] - ), - ]; - } - /** * Sort, group and normalize attributes for display on the consent page. * @@ -88,6 +57,7 @@ public function getFunctions(): array * @param NaneID|null $nameId * @return array */ + #[AsTwigFunction(name: 'sortByDisplayOrder', isSafe: ['html'])] public function sortByDisplayOrder($attributes, array $attributeSources = null, NameID $nameId = null) { $sortedAttributes = $this->attributeMetadata->sortByDisplayOrder($attributes); @@ -106,6 +76,7 @@ public function sortByDisplayOrder($attributes, array $attributeSources = null, * @param string $source Source identifier (e.g. "voot") * @return string URL */ + #[AsTwigFunction(name: 'attributeSourceLogoUrl')] public function getAttributeSourceLogoUrl($source) { return $this->translator->trans('consent_attribute_source_logo_url_' . strtolower($source)); @@ -117,6 +88,7 @@ public function getAttributeSourceLogoUrl($source) * @param string $source Source identifier (e.g. "voot") * @return string */ + #[AsTwigFunction(name: 'attributeSourceDisplayName', isSafe: ['html'])] public function getAttributeSourceDisplayName($source) { return $this->translator->trans('consent_attribute_source_' . strtolower($source)); @@ -130,6 +102,7 @@ public function getAttributeSourceDisplayName($source) * @param string $preferecLocale * @return mixed */ + #[AsTwigFunction(name: 'attributeShortName', isSafe: ['html'])] public function getAttributeShortName($attributeId, $preferecLocale = 'en') { $attributeShortName = $this->getAttributeName($attributeId, $preferecLocale); @@ -145,6 +118,7 @@ public function getAttributeShortName($attributeId, $preferecLocale = 'en') * @param string $preferedLocale * @return string */ + #[AsTwigFunction(name: 'attributeName', isSafe: ['html'])] public function getAttributeName($attributeId, $preferedLocale = 'en') { return $this->attributeMetadata->getName($attributeId, $preferedLocale); diff --git a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Spaceless.php b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Spaceless.php index 50ce3dcde3..7c3451d0c6 100644 --- a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Spaceless.php +++ b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Spaceless.php @@ -18,8 +18,7 @@ namespace OpenConext\EngineBlockBundle\Twig\Extensions\Extension; -use Twig\Extension\AbstractExtension; -use Twig\TwigFilter; +use Twig\Attribute\AsTwigFilter; /** * Custom replacement for the deprecated core Twig 'spaceless' filter (deprecated as of Twig 3.12). @@ -31,20 +30,14 @@ * between a closing angle bracket and an opening angle bracket ("> <" => "><"). Whitespace inside * tags or textual content is preserved. */ -class Spaceless extends AbstractExtension +class Spaceless { - public function getFilters(): array - { - return [ - new TwigFilter('spaceless', $this->spaceless(...), ['is_safe' => ['html']]), - ]; - } - /** * Removes whitespaces between HTML/XML tags. * Mirrors the prior (now deprecated) Twig spaceless filter behavior. */ - public function spaceless(?string $content): string + #[AsTwigFilter(name: 'spaceless', isSafe: ['html'])] + public static function spaceless(?string $content): string { if ($content === null) { return ''; diff --git a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Wayf.php b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Wayf.php index 40da4d0461..e66737a8eb 100644 --- a/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Wayf.php +++ b/src/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/Wayf.php @@ -22,10 +22,9 @@ use OpenConext\EngineBlockBundle\Service\IdpHistoryService; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Contracts\Translation\TranslatorInterface; -use Twig\Extension\AbstractExtension; -use Twig\TwigFunction; +use Twig\Attribute\AsTwigFunction; -class Wayf extends AbstractExtension +class Wayf { const PREVIOUS_SELECTION_COOKIE_NAME = 'selectedidps'; const REMEMBER_CHOICE_COOKIE_NAME = 'rememberchoice'; @@ -48,30 +47,12 @@ public function __construct(RequestStack $requestStack, TranslatorInterface $tra $this->translator = $translator; } - public function getFunctions(): array - { - return [ - new TwigFunction( - 'wayfConfig', - $this->getWayfJsonConfig(...) - ), - new TwigFunction( - 'connectedIdps', - $this->getConnectedIdps(...) - ), - new TwigFunction( - 'idpDiscoveryHash', - $this->idpDiscoveryHash(...) - ), - - ]; - } - /** * @param array $idpList * * @return ConnectedIdps */ + #[AsTwigFunction(name: 'connectedIdps')] public function getConnectedIdps(array $idpList): ConnectedIdps { $previousSelectionIndex = $this->indexPreviousSelection(); @@ -165,6 +146,7 @@ function (array $idp) use ($previousSelectionIndex) { * * @return string Returns a json encoded config string. Used by the JavaScript of the Wayf to behave as intended. */ + #[AsTwigFunction(name: 'wayfConfig')] public function getWayfJsonConfig( ConnectedIdps $connectedIdPs, ServiceProvider $serviceProvider, @@ -230,6 +212,7 @@ private function loadPreviousSelectionFromCookie(RequestStack $requestStack) return $previousSelectionIndexed; } + #[AsTwigFunction(name: 'idpDiscoveryHash')] public function idpDiscoveryHash(string $entityId, ?string $discoveryHash = null): string { return (new IdpHistoryService())->makeIdpDiscoveryHash($entityId, $discoveryHash); diff --git a/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/FeedbackController.php b/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/FeedbackController.php index 2dc294a716..4827179016 100644 --- a/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/FeedbackController.php +++ b/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/FeedbackController.php @@ -92,7 +92,7 @@ public function feedbackAction(Request $request) */ private function getTemplate(Request $request) { - $key = $request->get('template'); + $key = $request->query->getString('template'); if (!$key) { $key = 'session-lost'; } @@ -112,7 +112,7 @@ private function getFeedbackInfo(Request $request) "artCode":"31914" }'; - $feedbackInfo = $request->get('feedback-info', $default); + $feedbackInfo = $request->query->getString('feedback-info', $default); $feedbackInfo = json_decode($feedbackInfo, true); if (!empty($feedbackInfo['IdentityProvider']) || !empty($feedbackInfo['IdP'])) { @@ -130,7 +130,7 @@ private function getTemplateParameters(Request $request) { $default = '{}'; - $parameters = $request->get('parameters', $default); + $parameters = $request->query->getString('parameters', $default); $parameters = json_decode($parameters, true); diff --git a/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/ServiceProviderController.php b/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/ServiceProviderController.php index 859f50b336..8536fa85e5 100644 --- a/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/ServiceProviderController.php +++ b/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/ServiceProviderController.php @@ -144,7 +144,7 @@ public function assertionConsumerAction(Request $request) throw new RuntimeException(sprintf('Unrecognized message type received: "%s"', get_class($message))); } - $xml = base64_decode($request->get('SAMLResponse')); + $xml = base64_decode($request->request->getString('SAMLResponse') ?: $request->query->getString('SAMLResponse')); // Format the XML $doc = new DomDocument('1.0'); diff --git a/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/WayfController.php b/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/WayfController.php index 8c1ce73b88..eaa62604e1 100644 --- a/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/WayfController.php +++ b/src/OpenConext/EngineBlockFunctionalTestingBundle/Controllers/WayfController.php @@ -40,21 +40,19 @@ public function __construct(Environment $twig) public function wayfAction(Request $request) { - $currentLocale = $request->get('lang', 'en'); + $currentLocale = $request->query->getString('lang', 'en'); $request->cookies->set('lang', $currentLocale); - $backLink = (bool) $request->get('backLink', false); - $displayUnconnectedIdpsWayf = (bool) $request->get('displayUnconnectedIdpsWayf', false); - $addDiscoveries = (bool) $request->get('addDiscoveries', true); - $rememberChoiceFeature = (bool) $request->get('rememberChoiceFeature', false); - $cutoffPointForShowingUnfilteredIdps = $request->get('cutoffPointForShowingUnfilteredIdps', 100); - $showIdPBanner = $request->get('showIdPBanner', true); - $defaultIdpEntityId = $request->get('defaultIdpEntityId', null); - // Casting a string 'true' or 'false' using filter_var (bool) does not work here - $showIdPBanner = filter_var($showIdPBanner, FILTER_VALIDATE_BOOLEAN); + $backLink = $request->query->getBoolean('backLink'); + $displayUnconnectedIdpsWayf = $request->query->getBoolean('displayUnconnectedIdpsWayf'); + $addDiscoveries = $request->query->getBoolean('addDiscoveries', true); + $rememberChoiceFeature = $request->query->getBoolean('rememberChoiceFeature'); + $cutoffPointForShowingUnfilteredIdps = $request->query->getInt('cutoffPointForShowingUnfilteredIdps', 100); + $showIdPBanner = $request->query->getBoolean('showIdPBanner', true); + $defaultIdpEntityId = $request->query->get('defaultIdpEntityId'); - $connectedIdps = (int) $request->get('connectedIdps', 5); - $unconnectedIdps = (int) $request->get('unconnectedIdps', 0); - $randomIdps = (int) $request->get('randomIdps', 0); + $connectedIdps = $request->query->getInt('connectedIdps', 5); + $unconnectedIdps = $request->query->getInt('unconnectedIdps'); + $randomIdps = $request->query->getInt('randomIdps'); $idpList = $randomIdps === 0 ? TestEntitySeeder::buildIdps($connectedIdps, $unconnectedIdps, $currentLocale, $defaultIdpEntityId, $addDiscoveries) diff --git a/src/OpenConext/EngineBlockFunctionalTestingBundle/Mock/MockStepupGateway.php b/src/OpenConext/EngineBlockFunctionalTestingBundle/Mock/MockStepupGateway.php index 0671db0e46..60ddb86f7b 100644 --- a/src/OpenConext/EngineBlockFunctionalTestingBundle/Mock/MockStepupGateway.php +++ b/src/OpenConext/EngineBlockFunctionalTestingBundle/Mock/MockStepupGateway.php @@ -180,7 +180,7 @@ private function createSecondFactorOnlyResponse($nameId, $destination, $authnCon private function parseRequest(Request $request, $fullRequestUri) { // the GET parameter is already urldecoded by Symfony, so we should not do it again. - $requestData = $request->get(self::PARAMETER_REQUEST); + $requestData = $request->query->getString(self::PARAMETER_REQUEST); $samlRequest = base64_decode($requestData, true); if ($samlRequest === false) { throw new BadRequestHttpException('Failed decoding the request, did not receive a valid base64 string'); @@ -241,9 +241,9 @@ private function parseRequest(Request $request, $fullRequestUri) // The query string to validate needs to be urlencoded again because Symfony has already decoded this for us $query = self::PARAMETER_REQUEST . '=' . urlencode($requestData); - $query .= '&' . self::PARAMETER_SIGNATURE_ALGORITHM . '=' . urlencode($request->get(self::PARAMETER_SIGNATURE_ALGORITHM)); + $query .= '&' . self::PARAMETER_SIGNATURE_ALGORITHM . '=' . urlencode($request->query->getString(self::PARAMETER_SIGNATURE_ALGORITHM)); - $signature = base64_decode($request->get(self::PARAMETER_SIGNATURE)); + $signature = base64_decode($request->query->getString(self::PARAMETER_SIGNATURE)); if (!$key->verifySignature($query, $signature)) { throw new BadRequestHttpException( diff --git a/src/OpenConext/EngineBlockFunctionalTestingBundle/Mock/MockTranslator.php b/src/OpenConext/EngineBlockFunctionalTestingBundle/Mock/MockTranslator.php index d0abe7820a..d209de812a 100644 --- a/src/OpenConext/EngineBlockFunctionalTestingBundle/Mock/MockTranslator.php +++ b/src/OpenConext/EngineBlockFunctionalTestingBundle/Mock/MockTranslator.php @@ -64,12 +64,6 @@ public function trans(string $id, array $parameters = [], ?string $domain = null return $this->translator->trans($id, $parameters, $domain, $locale); } - public function transChoice($id, $number, array $parameters = [], $domain = null, $locale = null) - { - $this->translator->getCatalogue($locale)->add($this->translations); - return $this->translator->transChoice($id, $number, $parameters, $domain, $locale); - } - public function setLocale(string $locale): void { $this->translator->setLocale($locale); diff --git a/symfony.lock b/symfony.lock index 79c1b1816f..85d19f326e 100644 --- a/symfony.lock +++ b/symfony.lock @@ -182,6 +182,18 @@ "tests/bootstrap.php" ] }, + "symfony/property-info": { + "version": "7.4", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.3", + "ref": "dae70df71978ae9226ae915ffd5fad817f5ca1f7" + }, + "files": [ + "config/packages/property_info.yaml" + ] + }, "symfony/routing": { "version": "5.4", "recipe": { diff --git a/tests/library/EngineBlock/Test/Corto/Module/Service/ProcessConsentTest.php b/tests/library/EngineBlock/Test/Corto/Module/Service/ProcessConsentTest.php index 18095329ff..b315fdb19f 100644 --- a/tests/library/EngineBlock/Test/Corto/Module/Service/ProcessConsentTest.php +++ b/tests/library/EngineBlock/Test/Corto/Module/Service/ProcessConsentTest.php @@ -291,8 +291,7 @@ private function mockProcessingStateHelper() $request = new Request(); $request->setSession(new Session($this->sessionMock)); - $stack = new RequestStack(); - $stack->push($request); + $stack = new RequestStack([$request]); return new ProcessingStateHelper($stack); } diff --git a/tests/library/EngineBlock/Test/Corto/Module/Service/ProvideConsentTest.php b/tests/library/EngineBlock/Test/Corto/Module/Service/ProvideConsentTest.php index 10e78a8d7e..0b76e6df49 100644 --- a/tests/library/EngineBlock/Test/Corto/Module/Service/ProvideConsentTest.php +++ b/tests/library/EngineBlock/Test/Corto/Module/Service/ProvideConsentTest.php @@ -371,8 +371,7 @@ private function mockProcessingStateHelper() $request = new Request(); $request->setSession(new Session($this->sessionMock)); - $stack = new RequestStack(); - $stack->push($request); + $stack = new RequestStack([$request]); return new ProcessingStateHelper($stack); } diff --git a/tests/unit/OpenConext/EngineBlock/Service/SsoNotificationServiceTest.php b/tests/unit/OpenConext/EngineBlock/Service/SsoNotificationServiceTest.php index 70b3827b9e..d4035f5de7 100644 --- a/tests/unit/OpenConext/EngineBlock/Service/SsoNotificationServiceTest.php +++ b/tests/unit/OpenConext/EngineBlock/Service/SsoNotificationServiceTest.php @@ -20,13 +20,13 @@ use EngineBlock_Corto_ProxyServer; use EngineBlock_Saml2_AuthnRequestAnnotationDecorator; +use Monolog\Logger; use OpenConext\EngineBlock\Metadata\Entity\IdentityProvider; use OpenConext\EngineBlock\Metadata\MetadataRepository\InMemoryMetadataRepository; use Phake; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\Monolog\Logger; use Symfony\Component\HttpFoundation\Request; class SsoNotificationServiceTest extends TestCase diff --git a/tests/unit/OpenConext/EngineBlock/Service/SsoSessionServiceTest.php b/tests/unit/OpenConext/EngineBlock/Service/SsoSessionServiceTest.php index 57ff18feb5..4160c641c9 100644 --- a/tests/unit/OpenConext/EngineBlock/Service/SsoSessionServiceTest.php +++ b/tests/unit/OpenConext/EngineBlock/Service/SsoSessionServiceTest.php @@ -18,11 +18,11 @@ namespace OpenConext\EngineBlock\Service; +use Monolog\Logger; use Phake; use PHPUnit\Framework\Attributes\Group; use PHPUnit\Framework\Attributes\Test; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\Monolog\Logger; use Symfony\Component\HttpFoundation\ParameterBag; class SsoSessionServiceTest extends TestCase diff --git a/tests/unit/OpenConext/EngineBlock/Xml/MetadataRendererTest.php b/tests/unit/OpenConext/EngineBlock/Xml/MetadataRendererTest.php index 51321a5a75..ad2bbc6a95 100644 --- a/tests/unit/OpenConext/EngineBlock/Xml/MetadataRendererTest.php +++ b/tests/unit/OpenConext/EngineBlock/Xml/MetadataRendererTest.php @@ -54,6 +54,7 @@ use Symfony\Bridge\Twig\Extension\TranslationExtension; use Symfony\Contracts\Translation\TranslatorInterface; use Twig\Environment; +use Twig\Extension\AttributeExtension; use Twig\Loader\FilesystemLoader; class MetadataRendererTest extends TestCase @@ -320,7 +321,7 @@ private function buildMetadataRenderer(string $addRequestedAttributes) $translatorExtension = new TranslationExtension($translator); $environment->addExtension($translatorExtension); - $environment->addExtension(new Spaceless()); + $environment->addExtension(new AttributeExtension(Spaceless::class)); $keyPairFactory = $this->createMock(KeyPairFactory::class); $keyPairFactory diff --git a/tests/unit/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/WayfTest.php b/tests/unit/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/WayfTest.php index 2065d3ba21..a346324a71 100644 --- a/tests/unit/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/WayfTest.php +++ b/tests/unit/OpenConext/EngineBlockBundle/Twig/Extensions/Extension/WayfTest.php @@ -23,7 +23,6 @@ use OpenConext\EngineBlockBundle\Twig\Extensions\Extension\Wayf; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -use Symfony\Component\HttpFoundation\ParameterBag; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Contracts\Translation\TranslatorInterface; @@ -105,12 +104,11 @@ public static function previousSelectionProvider(): array public function testGetConnectedIdpsWithPreviousSelection(string $storedCookieValue, string $expectedName) { // Create a mock request with cookie - $request = $this->createMock(Request::class); - $request->cookies = $this->createMock(ParameterBag::class); - $request->cookies->method('get') - ->willReturn(json_encode([ + $request = Request::create('/', 'GET', [], [ + 'selectedidps' => json_encode([ ['idp' => $storedCookieValue, 'time' => 12345] - ])); + ]) + ]); $requestStack = $this->createMock(RequestStack::class); $requestStack->method('getCurrentRequest')