История коммитов

.
docs: record stage 5b in the migration plan
The request is now an action argument everywhere; records the rules the three subagent batches converged on, how the eight non-controller services were split between a method parameter and the RequestStack, and the six live bugs that were hiding under PHPStan baseline entries.
.
refactor(modules): pass the request as an action argument
Closes the remaining modules: contacts, mail, collections, consent, community, help, language, login, notifications, redirect and registration. Controllers no longer hold a Request from the container; private helpers and the ContactForm / HelpLegacyRedirectHandler services take it as a parameter.

Fixes two identical defects found under baseline entries: ContactSettingsController::postedTranslations() and CookieBannerController::buildDto() read multilingual array fields with body(), which returns a string and makes InputBag throw a BadRequestException, so saving either settings page answered 400 whenever a translated field was filled in. Both now use bodyList().
.
refactor(http): read the current request from the stack in shared services
PaginationFactory, PaginationGuard and Theme outlive a request but were built with one. They now read the current request from the RequestStack, the line already taken for Environment, Ads, Counters and LocaleResolver: passing it as an argument would mean touching ~70 files whose actions never take a Request, and Theme is resolved straight from templates where no request exists.
.
refactor(library): pass the request as an action argument
Controllers are container singletons, so a Request injected into the constructor outlives the request it belongs to. Every library controller now takes it as the first action argument; private helpers receive it as a parameter, and LegacyRedirectHandler::handle() takes it from its caller.

Fixes CreateArticleController::renderForm(), called with 9 of its 10 required arguments on both validation-error branches: a flood-control hit or an empty title raised an ArgumentCountError instead of re-rendering the form. The matching PHPStan baseline entry is gone.
.
refactor(album): pass the request as an action argument
Only the actions that actually read the request take it; form and confirmation actions keep their signatures.
.
refactor(profile): pass the request as an action argument
Only the actions that actually read the request take it; form actions keep their signatures.
.
refactor(guestbook): pass the request as an action argument
GuestbookForm::getFormData() now takes the request as a parameter instead of holding it in the constructor: it reads five body fields plus the attached files, which does not reduce to a scalar fact, and a RequestStack in the module's application layer would reintroduce the hidden capture this stage removes.
.
refactor(downloads): pass the request as an action argument
Controllers are container singletons, so a Request injected into the constructor outlives the request it belongs to. Every downloads controller now takes it as the first action argument; private handlers receive it as a parameter, and DownloadPathController forwards it to the controllers it delegates to.

Fixes ImportFileController::handleImport(), which read $category from the caller's scope: a successful import failed with a TypeError in getCategoryUrl(). The helper now takes the category as a parameter, and the matching PHPStan baseline entry is gone.
.
refactor(admin): pass the request as an action argument
Controllers are container singletons, so a Request injected into the constructor outlives the request it belongs to. Every admin controller now takes it as the first action argument; private helpers such as isCsrfValid() receive it as a parameter.
.
refactor(forum): pass the request as an action argument
Controllers are container singletons, so a Request injected into the constructor outlives the request it belongs to. Every forum controller now takes it as the first action argument; private helpers receive it as a parameter.

ForumUtils::topicLink() no longer resolves the request from the container: it needs the host only, which the caller now passes as a string.