From 07db716b2a25dbd10df5a208168a60f07f51f31f Mon Sep 17 00:00:00 2001 From: clem Date: Wed, 14 Oct 2026 14:12:33 +0200 Subject: [PATCH 1/3] upgrade composer from symfony 6.4 to ^7.0 (->7.4) --- composer.json | 68 +++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/composer.json b/composer.json index f10c70d7d..c5d955cd7 100644 --- a/composer.json +++ b/composer.json @@ -46,42 +46,42 @@ "scienta/doctrine-json-functions": "^6", "siriusphp/upload": "^4.0", "squirrelphp/twig-php-syntax": "^1.6", - "symfony/asset": "^6.4", - "symfony/cache": "^6.4", - "symfony/console": "^6.4", - "symfony/debug-bundle": "^6.4", - "symfony/dependency-injection": "^6.4", - "symfony/dotenv": "^6.4", - "symfony/error-handler": "^6.4", - "symfony/event-dispatcher": "^6.4", - "symfony/expression-language": "^6.4", + "symfony/asset": "^7.0", + "symfony/cache": "^7.0", + "symfony/console": "^7.0", + "symfony/debug-bundle": "^7.0", + "symfony/dependency-injection": "^7.0", + "symfony/dotenv": "^7.0", + "symfony/error-handler": "^7.0", + "symfony/event-dispatcher": "^7.0", + "symfony/expression-language": "^7.0", "symfony/flex": "^2.0", - "symfony/form": "^6.4", - "symfony/framework-bundle": "^6.4", - "symfony/http-client": "^6.4", - "symfony/mailer": "^6.4", - "symfony/mime": "^6.4", - "symfony/monolog-bridge": "^6.4", + "symfony/form": "^7.0", + "symfony/framework-bundle": "^7.0", + "symfony/http-client": "^7.0", + "symfony/mailer": "^7.0", + "symfony/mime": "^7.0", + "symfony/monolog-bridge": "^7.0", "symfony/monolog-bundle": "^3.7", - "symfony/password-hasher": "^6.4", + "symfony/password-hasher": "^7.0", "symfony/polyfill-php72": "^1.23", "symfony/polyfill-php84": "^1.31", - "symfony/rate-limiter": "^6.4", - "symfony/runtime": "^6.4", - "symfony/security-bundle": "^6.4", - "symfony/security-csrf": "^6.4", - "symfony/serializer": "^6.4", - "symfony/stopwatch": "^6.4", - "symfony/string": "^6.4", - "symfony/translation": "^6.4", - "symfony/twig-bridge": "^6.4", - "symfony/twig-bundle": "^6.4", - "symfony/validator": "^6.4", - "symfony/var-dumper": "^6.4", - "symfony/var-exporter": "^6.4", - "symfony/web-profiler-bundle": "^6.4", + "symfony/rate-limiter": "^7.0", + "symfony/runtime": "^7.0", + "symfony/security-bundle": "^7.0", + "symfony/security-csrf": "^7.0", + "symfony/serializer": "^7.0", + "symfony/stopwatch": "^7.0", + "symfony/string": "^7.0", + "symfony/translation": "^7.0", + "symfony/twig-bridge": "^7.0", + "symfony/twig-bundle": "^7.0", + "symfony/validator": "^7.0", + "symfony/var-dumper": "^7.0", + "symfony/var-exporter": "^7.0", + "symfony/web-profiler-bundle": "^7.0", "symfony/webpack-encore-bundle": "^2.2", - "symfony/yaml": "^6.4", + "symfony/yaml": "^7.0", "symfonycasts/reset-password-bundle": "^1.9", "twig/extra-bundle": "^3.3", "twig/html-extra": "^3.3", @@ -122,8 +122,8 @@ "phpstan/phpstan-symfony": "2.0.9", "phpunit/phpunit": "^11.5", "rector/rector": "2.2.11", - "symfony/browser-kit": "^6.4", - "symfony/css-selector": "^6.4", + "symfony/browser-kit": "^7.0", + "symfony/css-selector": "^7.0", "symplify/easy-coding-standard": "13.2.3" }, "config": { @@ -147,7 +147,7 @@ "public-dir": "public", "symfony": { "allow-contrib": true, - "require": "^6.4" + "require": "^7.0" } }, "autoload": { From c2f09b90a2c179c60881a81364e44fb4014b951b Mon Sep 17 00:00:00 2001 From: clem Date: Wed, 14 Oct 2026 14:14:08 +0200 Subject: [PATCH 2/3] get rid of the $request->get() deprecation warning corrected with GPT-5.6-luna --- .../Backend/Async/SelectOptionsController.php | 8 +++---- .../Backend/Async/UploadController.php | 2 +- .../Backend/DashboardController.php | 2 +- src/Controller/Backend/UserController.php | 4 ++-- src/Controller/Backend/UserEditController.php | 2 +- src/Controller/CsrfTrait.php | 12 +++++++++- src/Controller/Frontend/DetailController.php | 2 +- src/Controller/TwigAwareController.php | 22 +++++++++++++------ src/Security/LoginFormAuthenticator.php | 8 +++++-- src/Storage/Handler/SelectQueryHandler.php | 2 +- 10 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/Controller/Backend/Async/SelectOptionsController.php b/src/Controller/Backend/Async/SelectOptionsController.php index c685b626c..1b0e3ffa5 100644 --- a/src/Controller/Backend/Async/SelectOptionsController.php +++ b/src/Controller/Backend/Async/SelectOptionsController.php @@ -28,13 +28,13 @@ public function __construct( #[Route(path: '/select-options', name: 'bolt_async_select_options', methods: [Request::METHOD_GET])] public function handleSelectOptions(Request $request): JsonResponse { - [$contentTypeSlug, $format] = explode('/', (string) $request->get('values')); + [$contentTypeSlug, $format] = explode('/', (string) $request->query->get('values')); - if (empty($maxAmount = $request->get('limit'))) { + if (empty($maxAmount = $request->query->get('limit'))) { $maxAmount = $this->config->get('general/maximum_listing_select', 200); } - $order = $request->get('order'); + $order = $request->query->get('order'); $options = []; @@ -56,7 +56,7 @@ public function handleSelectOptions(Request $request): JsonResponse 'order' => $order, ]; - $field = $this->fieldExtension->fieldFactory($request->get('name')); + $field = $this->fieldExtension->fieldFactory($request->query->get('name')); $options = array_merge($options, $this->fieldExtension->selectOptionsHelper($contentTypeSlug, $params, $field, $format)); diff --git a/src/Controller/Backend/Async/UploadController.php b/src/Controller/Backend/Async/UploadController.php index 90c7edbc7..a42f8ad11 100644 --- a/src/Controller/Backend/Async/UploadController.php +++ b/src/Controller/Backend/Async/UploadController.php @@ -63,7 +63,7 @@ public function handleURLUpload(Request $request, ValidatorInterface $validator) ], Response::HTTP_FORBIDDEN); } - $url = $request->get('url', ''); + $url = $request->request->get('url', ''); // Make sure the submitting URL is a valid URL $violations = $validator->validate($url, new Url()); diff --git a/src/Controller/Backend/DashboardController.php b/src/Controller/Backend/DashboardController.php index b16981bcc..b37d04257 100644 --- a/src/Controller/Backend/DashboardController.php +++ b/src/Controller/Backend/DashboardController.php @@ -19,7 +19,7 @@ public function index(Request $request, Query $query): Response // TODO PERMISSIONS: implement listing that only lists content that the user is allowed to see $amount = (int) $this->config->get('general/records_per_page', 10); - $page = (int) ($request->get('page') ?? 1); + $page = (int) ($request->query->get('page') ?? 1); $contentTypes = $this->config->get('contenttypes')->where('show_on_dashboard', true)->keys()->implode(','); $filter = strip_tags((string) $this->getFromRequest($request, 'filter', '')); diff --git a/src/Controller/Backend/UserController.php b/src/Controller/Backend/UserController.php index 4e7c97b7c..3ccad13a1 100644 --- a/src/Controller/Backend/UserController.php +++ b/src/Controller/Backend/UserController.php @@ -31,12 +31,12 @@ public function __construct( public function users(Request $request, Query $query): Response { $order = 'username'; - if ($request->get('sortBy')) { + if ($request->query->get('sortBy')) { $order = $this->getFromRequest($request, 'sortBy'); } $like = ''; - if ($request->get('filter')) { + if ($request->query->get('filter')) { $like = '%' . $this->getFromRequest($request, 'filter') . '%'; } diff --git a/src/Controller/Backend/UserEditController.php b/src/Controller/Backend/UserEditController.php index 871e48f3a..1e180133e 100644 --- a/src/Controller/Backend/UserEditController.php +++ b/src/Controller/Backend/UserEditController.php @@ -123,7 +123,7 @@ public function status(Request $request, User $user): Response { $this->validateCsrf($request, 'useredit'); - $newStatus = $request->get('status') ?? UserStatus::DISABLED; + $newStatus = $request->query->get('status', $request->request->get('status')) ?? UserStatus::DISABLED; $user->setStatus($newStatus); $this->addFlash('success', 'user.updated_successfully'); diff --git a/src/Controller/CsrfTrait.php b/src/Controller/CsrfTrait.php index c1200855f..8628c4756 100644 --- a/src/Controller/CsrfTrait.php +++ b/src/Controller/CsrfTrait.php @@ -22,7 +22,17 @@ public function setCsrfTokenManager(CsrfTokenManagerInterface $csrfTokenManager) protected function validateCsrf(Request $request, string $tokenId): void { - $token = new CsrfToken($tokenId, $request->get('_csrf_token', $request->get('token'))); + $tokenValue = $request->attributes->get( + '_csrf_token', + $request->query->get( + '_csrf_token', + $request->request->get( + '_csrf_token', + $request->attributes->get('token', $request->query->get('token', $request->request->get('token'))) + ) + ) + ); + $token = new CsrfToken($tokenId, $tokenValue); if (! $this->csrfTokenManager->isTokenValid($token)) { throw new InvalidCsrfTokenException(); diff --git a/src/Controller/Frontend/DetailController.php b/src/Controller/Frontend/DetailController.php index 1c914e480..fc59654ee 100644 --- a/src/Controller/Frontend/DetailController.php +++ b/src/Controller/Frontend/DetailController.php @@ -48,7 +48,7 @@ public function record(Request $request, $slugOrId, ?string $contentTypeSlug = n $this->contentHelper->setCanonicalPath($record); // Check if we're attempting to preview an unpublished Record - if ($record && $this->validateSecret($request->get('secret') ?? '', (string) $record->getId())) { + if ($record && $this->validateSecret($request->query->get('secret', ''), (string) $record->getId())) { $requirePublished = false; } diff --git a/src/Controller/TwigAwareController.php b/src/Controller/TwigAwareController.php index d43695e2a..37df6f145 100644 --- a/src/Controller/TwigAwareController.php +++ b/src/Controller/TwigAwareController.php @@ -155,7 +155,7 @@ protected function redirectToDefaultLocale(Request $request): ?Response $params['_locale'] = $this->defaultLocale; } - return $this->redirectToRoute($request->get('_route'), $params); + return $this->redirectToRoute($request->attributes->get('_route'), $params); } private function setTwigLoader(): void @@ -246,18 +246,18 @@ public function createPagerParams(Request $request, string $order): array 'returnmultiple' => true, ]; - if ($request->get('sortBy')) { + if ($request->query->get('sortBy')) { $params['order'] = $this->getFromRequest($request, 'sortBy'); } else { $params['order'] = $order; } - if ($request->get('filter')) { - $key = $request->get('filterKey', 'anyField'); + if ($request->query->get('filter')) { + $key = $request->query->get('filterKey', 'anyField'); $params[$key] = '%' . $this->getFromRequest($request, 'filter') . '%'; } - if ($request->get('taxonomy')) { + if ($request->query->get('taxonomy')) { $taxonomy = explode('=', (string) $this->getFromRequest($request, 'taxonomy')); $params[$taxonomy[0]] = $taxonomy[1]; } @@ -267,17 +267,25 @@ public function createPagerParams(Request $request, string $order): array public function getFromRequestRaw(Request $request, string $parameter): string { - return $request->get($parameter) ?? ''; + return $this->getRequestParameter($request, $parameter) ?? ''; } public function getFromRequest(Request $request, string $parameter, ?string $default = null): ?string { - $parameter = mb_trim($this->sanitiser->clean($request->get($parameter, '') ?? '')); + $parameter = mb_trim($this->sanitiser->clean($this->getRequestParameter($request, $parameter, '') ?? '')); // `clean` returns a string, but we want to be able to get `null`. return empty($parameter) ? $default : $parameter; } + protected function getRequestParameter(Request $request, string $parameter, mixed $default = null): mixed + { + return $request->attributes->get( + $parameter, + $request->query->get($parameter, $request->request->get($parameter, $default)) + ); + } + public function getFromRequestArray(Request $request, array $parameters, ?string $default = null): ?string { foreach ($parameters as $parameter) { diff --git a/src/Security/LoginFormAuthenticator.php b/src/Security/LoginFormAuthenticator.php index 72f39b9fe..951c8fa03 100644 --- a/src/Security/LoginFormAuthenticator.php +++ b/src/Security/LoginFormAuthenticator.php @@ -63,8 +63,12 @@ public function authenticate(Request $request): Passport public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response { // @todo: Allow different roles to redirect to different pages on success. - if ($request->get('_target_path', false)) { - $fallback = $request->get('_target_path'); + $targetPath = $request->attributes->get( + '_target_path', + $request->query->get('_target_path', $request->request->get('_target_path', false)) + ); + if ($targetPath) { + $fallback = $targetPath; } elseif ($this->security->isGranted('dashboard')) { $fallback = $this->router->generate('bolt_dashboard'); } else { diff --git a/src/Storage/Handler/SelectQueryHandler.php b/src/Storage/Handler/SelectQueryHandler.php index 3a5b246d1..46ef880f4 100644 --- a/src/Storage/Handler/SelectQueryHandler.php +++ b/src/Storage/Handler/SelectQueryHandler.php @@ -80,7 +80,7 @@ private function createPaginator(?Request $request, Query $query, int $amountPer if ($page === null) { // If we don't have $request, we're likely not in a web context. if ($request) { - $page = (int) $request->get('page', 1); + $page = (int) $request->query->get('page', 1); } else { $page = 1; } From 3b5902abb898f94becb8573f49b8c03a2ac4b10c Mon Sep 17 00:00:00 2001 From: clem Date: Wed, 14 Oct 2026 14:15:33 +0200 Subject: [PATCH 3/3] Get rid of the Compilation Error: Compile Error: Type of Bolt\Extension\ExtensionController::$container must be Psr\Container\ContainerInterface (as in class Symfony\Bundle\FrameworkBundle\Controller\AbstractController) Fixed by GPT-5.6-Luna --- src/Event/Subscriber/ExtensionSubscriber.php | 1 + src/Extension/ServicesTrait.php | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Event/Subscriber/ExtensionSubscriber.php b/src/Event/Subscriber/ExtensionSubscriber.php index 965b96816..3c65c38df 100644 --- a/src/Event/Subscriber/ExtensionSubscriber.php +++ b/src/Event/Subscriber/ExtensionSubscriber.php @@ -46,6 +46,7 @@ public function onKernelController(ControllerEvent $event): void if ($controller instanceof ExtensionController) { $controller->injectObjects([ 'manager' => $this->objectManager, + 'container' => $this->container, 'query' => $this->query, ]); } diff --git a/src/Extension/ServicesTrait.php b/src/Extension/ServicesTrait.php index b172f5e1e..d1a71baab 100644 --- a/src/Extension/ServicesTrait.php +++ b/src/Extension/ServicesTrait.php @@ -25,8 +25,7 @@ trait ServicesTrait /** @var EntityManagerInterface */ protected $entityManager; - /** @var ContainerInterface */ - protected $container; + protected ?ContainerInterface $servicesContainer = null; /** @var Query */ protected $query; @@ -45,8 +44,8 @@ public function injectObjects(array $objects): void $this->entityManager = $objects['manager']; $this->query = $objects['query']; - if (! $this->container && $container = $objects['container'] ?? null) { - $this->container = $container; + if (! $this->servicesContainer && $container = $objects['container'] ?? null) { + $this->servicesContainer = $container; } } @@ -147,7 +146,7 @@ public function getLogger(): LoggerInterface public function getContainer(): ContainerInterface { - return $this->container; + return $this->servicesContainer; } public function getQuery(): Query