Bug #152
offen[Bugsink] TYPO3\CMS\Extbase\Mvc\Controller\Exception\RequiredArgumentMissingException: Required argument "queryString" is not set for ApacheSolrForTypo3\Solr\C…
0%
Beschreibung
Bugsink: https://bugsink.cytrus.de/issues/issue/e54d0dcc-5100-44b9-8ff2-db31f3c42e88/event/last/
Typ: NEW issue
Projekt: www-rietberg-de
Bugsink Alert
TYPO3\CMS\Extbase\Mvc\Controller\Exception\RequiredArgumentMissingException: Required argument "queryString" is not set for ApacheSolrForTypo3\Solr\C…
Automatisch erstellt durch n8n
KI-Analyse:
1. WAS IST DAS PROBLEM?
TYPO3\CMS\Extbase\Mvc\Controller\Exception\RequiredArgumentMissingException:
Required argument "queryString" is not set for
ApacheSolrForTypo3\Solr\Controller\SuggestController->suggest
Das Extbase-Framework hat eine RequiredArgumentMissingException geworfen, weil die
suggestAction() des ApacheSolrForTypo3-SuggestControllers
wurde aufgerufen, ohne dass der Query-String-Parameter übergeben wurde, den sie
für die tatsächliche Suchvorschlagsanfrage erwartet.
In der Praxis bedeutet dies, dass der HTTP-Request (normalerweise eine GET-Anfrage),
der den Endpunkt typo3/index.php?...&tx_solrsolr_pi1[queryString]=… aufgerufen hat,
den Parameter tx_solrsolr_pi1[queryString] nicht gesetzt hat – der
Extbase-Argument-Validator hat einen erforderlichen Wert nicht gefunden und die
Exception ausgelöst.
2. WO HERKOMMT DAS? – ROOT CAUSE
| Ebene | Was passiert | Warum ist das wichtig? |
|---|---|---|
| Framework | Extbase validiert jeden Argumentnamen, der in einer Aktion als @param deklariert ist (oder der in __construct für den Controller verwendet wird). Wenn ein Argument als required markiert ist, wirft es RequiredArgumentMissingException, bevor die Aktion ausgeführt wird. |
Dies ist der Moment, in dem der Fehler auftritt, den wir sehen. |
| Extension (ApacheSolrForTypo3) |
SuggestController->suggestAction() ruft $this->request->getQueryParams()['queryString'] auf. Es gibt keinen Fallback, sodass der Abruf array_key_exists('queryString', $params) zurückgibt → false. |
Die Aktion kann ohne Query-String keinen Suchvorschlag generieren. |
| TypoScript/Frontend | Der Suchvorschlag-JavaScript-Code (oder ein Frontend-Plugin) erstellt eine URL für den Endpunkt „tx_solrsolr_pi1/suggest“. Wenn die URL den Abfrage-String nicht einbindet (oder einen leeren Wert einbindet, der fälschlicherweise als nicht gesetzt betrachtet wird), erreicht die Anfrage den Controller ohne queryString. |
Dies ist der eigentliche Auslöser. Der Fehler ist ein Symptom eines Problems in der Templating-/JS-Logik oder in der Konfiguration der Extension. |
| Routing | Die Extension verwendet Extbase-Routing: routes.php registriert typo3/index.php?tx_solrsolr_pi1[queryString]=foo&tx_solrsolr_pi1[controller]=Suggest&tx_solrsolr_pi1[action]=suggest. Wenn die generierte URL den Platzhalter für den Abfrage-String nicht ersetzt, fehlt der Parameter. |
Falsch generierte Routing-URLs werden nie einen erforderlichen Abfrage-String bereitstellen. |
Zusammenfassung:
Die Anfrage, die die Exception auslöst, ist missing den Parameter queryString (oder einen leeren Wert, der immer noch als „missing“ betrachtet wird), wenn sie den Endpunkt ApacheSolrForTypo3\Solr\Controller\SuggestController->suggest aufgerufen hat.
3. WO TRITT DAS PROBLEM AUF? – BETROFFENE EXTENSION
| Extension | Dateipfad (Typo3-Root) | Beschreibung |
|---|---|---|
ApacheSolrForTypo3 (solr in der Extension-Liste) |
vendor/apache-solr/typo3-solr/Classes/Solr/Controller/SuggestController.php |
Liefert den Endpunkt für Suchvorschläge (Autovervollständigung) an den Frontend-Search-Plugin. |
| TypoScript-Plugin-Konfiguration |
sitepackage/Configuration/TypoScript/setup.typoscript (oder was auch immer Ihre solr-Plugin-Konfiguration enthält) |
Definiert plugin.tx_solrsolr_pi1 – insbesondere die search.suggest* Optionen, die die URL erstellen. |
Alle anderen Dateien (Middleware, Application usw.) in der Stacktrace sind lediglich die normale TYPO3-Anfrageverarbeitung; sie sind nicht die Ursache des Problems.
4. CONCRETE FIXES (was Sie jetzt tun müssen)
Hinweis: Die Schritte gehen davon aus, dass Sie volle Zugriffsrechte auf dem
Server haben und dass Sie eine aktuelle Version der ApacheSolrForTypo3-Extension (≥ 9.0) verwenden. Wenn Sie noch eine sehr alte Version verwenden, sollten Sie zuerst ein Upgrade durchführen.
4.1. Überprüfen Sie die Frontend-URL, die den Endpunkt aufruft ¶
-
Aktivieren Sie die Logging-Funktion (falls nicht bereits geschehen)
- Setzen Sie
TYPO3_DEBUGauf2(oder verwenden Sie den neuentypo3.conf.php-ParameterLOG_REQUESTS). - Rufen Sie die Seite auf, die die Autovervollständigungs-JS auslöst (z. B.
search.html).
- Setzen Sie
-
Führen Sie eine Browser-Network-Anzeige durch (F12 → Netzwerk) und filtern Sie nach
suggest. -
Die entsprechende Anfrage sollte wie folgt aussehen:
https://example.com/index.php?id=123&tx_solrsolr_pi1[queryString]=<string>&tx_solrsolr_pi1[controller]=Suggest&tx_solrsolr_pi1[action]=suggestWenn Sie eine oder mehrere Anfragen ohne
tx_solrsolr_pi1[queryString](oder mit einem leeren Wert) finden:- Identifizieren Sie die JS-Datei, die die Anfrage erstellt (
/typo3/sysext/..., /typo3conf/ext/...). - In den meisten Fällen stammt der Code aus
EXT:solr/Resources/Public/JavaScript/Autocomplete.js(oder einer benutzerdefinierten Erweiterung, die das gleiche Muster kopiert hat).
- Identifizieren Sie die JS-Datei, die die Anfrage erstellt (
-
Problem beheben:
-
Fall A – Leerer Abfrage-String
Die JS-Routine erstellturl = url + '&tx_solrsolr_pi1[queryString]=' + encodeURIComponent(query);wobeiqueryundefiniert oder eine leere Zeichenfolge ist.
Lösung: Stellen Sie sicher, dassqueryeine nicht-leere Zeichenfolge ist, bevor die Anfrage gesendet wird. In der Regel:if (!query || query.trim().length === 0) { // Kein Sinn, die Vorschläge anzufordern – einfach die UL leeren und zurückkehren return; } -
Fall B – Der Platzhalter fehlt
Einige Theme/Extension-Versionen haben einen defekten Platzhalter:
.../suggest?tx_solrsolr_pi1[queryString]={{queryString}}...(d. h. die Kurze schließende Klammer fehlt).
Lösung: Finden Sie den fehlerhaften Template-Code und ersetzen Sie ihn durch den korrekten:data-url="{{ path('solr_suggest', {'queryString': query}) }}"oder, wenn Sie die niedrigere Ebene der TypoScript-basierenden URL-Erstellung verwenden:
plugin.tx_solrsolr_pi1.search.suggestUri = '{queryString}' -
Fall C – Die TypoScript-Konfiguration leitet den Abfrage-String nicht weiter
Insetup.typoscript(oderConstants.typoscript) hat der Eintragplugin.tx_solrsolr_pi1.search.suggestUrioft den Wert'0'oder'NULL'. Stellen Sie sicher, dass er wie folgt gesetzt ist:plugin.tx_solrsolr_pi1.search { suggestion { addSelfParams = 1 } suggestUri = '{queryString}' }
Nach jeder Änderung:
- Löschen Sie den Caching-Proxy (
clearCacheim Backend). - Laden Sie die Seite neu und überprüfen Sie erneut die Network-Anfrage.
-
4.2. Aktualisieren Sie den SuggestController selbst (optional, aber empfohlen)
¶
Die Extension erwartet den Abfrage-String-Parameter; Sie können die Aktion so anpassen, dass sie freundlich mit einem fehlenden/abgebrochenen Abfrage-String umgeht.
Öffnen Sie vendor/apache-solr/typo3-solr/Classes/Solr/Controller/SuggestController.php (oder das lokale Overwrite in typo3conf/ext/apache_solr/Classes/.../SuggestController.php, falls Sie die Extension gepatcht haben).
<?php
namespace ApacheSolrForTypo3\Solr\Controller;
use Psr\Http\Message\ResponseInterface;
use TYPO3\CMS\Core\Mvc\Controller\ActionController;
use TYPO3\CMS\Core\Page\PageRenderer;
use TYPO3\CMS\Extbase\Annotation as ExtbaseAnnotation;
use TYPO3\CMS\Extbase\Mvc\Exception\StopActionException;
use TYPO3\CMS\Extbase\Mvc\Exception\UnsupportedFormatException;
class SuggestController extends ActionController
{
/**
* @var \TYPO3\CMS\Solr\Domain\Repository\SearchRepository
*/
protected $searchRepository;
/**
* @var \TYPO3\CMS\Solr\Domain\Service\SolrService
*/
protected $solrService;
// … andere Injection …
public function suggestAction()
{
// Lesen Sie die Anfrage-Parameter sicher aus – sie können fehlen
$queryString = $this->request->getQueryParams()['queryString'] ?? null;
// Wenn queryString fehlt oder leer ist, geben Sie einfach ein leeres JSON zurück
if (empty($queryString)) {
$this->jsonResponse([]);
return;
}
// Reguläre Verarbeitung ...
$result = $this->searchRepository->getSuggestionForQuery($queryString);
$this->view->assign('suggestions', $result);
}
protected function jsonResponse(array $data): void
{
$this->response->setHeader('Content-Type', 'application/json');
$this->response->setContent(json_encode($data, JSON_UNESCAPED_UNICODE));
}
}
Warum diesen Code ändern?
- Dies verhindert den Ausbruch der
RequiredArgumentMissingException. - Es macht den Endpunkt robust gegenüber versehentlich leeren Anfragen (z. B. wenn ein Benutzer schnell tippt, löscht usw.).
- Es gewährleistet ein ordnungsgemäßes JSON-HTTP-Antwortformat, wenn kein Abfrage-String vorhanden ist (d. h. leeres Array).
Hinweis: Das Abfrage-String-Argument ist immer noch in der TypoScript-Routing-Konfiguration als required markiert, weil es von Extbase für die Argumentvalidierung verwendet wird.
Wenn Sie möchten, dass der Parameter optional wird, können Sie auch den Parameter in ext_tables.php/*_configureWizard.php umbenennen oder die extend.never Annotation für den Controller verwenden. Der einfachste, sicherste Ansatz ist jedoch, den Frontend-Code zu korrigieren, sodass der Parameter immer übergeben wird – und optional den Controller so anzupassen, dass er einen fehlenden Parameter sicher behandelt.
4.3. Stellen Sie sicher, dass die Extension-Konfiguration korrekt ist ¶
| Worauf zu achten ist | Wo zu bearbeiten | Erwarteter Wert |
|---|---|---|
plugin.tx_solrsolr_pi1.search.suggestUri |
sitepackage/Configuration/TypoScript/setup.typoscript (oder was auch immer Sie für das Solr-Plugin verwenden) |
{queryString} (oder eine vollständige URL, die den Platzhalter enthält) |
plugin.tx_solrsolr_pi1.search.addSelfParams (oder addQueryString) |
Gleicher Ort wie oben |
1 (damit die Anfrage den aktuellen Seiten-Id, das Language-Id usw. beibehält) |
plugin.tx_solrsolr_pi1.search.minimumQueryLength |
Gleicher Ort | Normalerweise 2 oder 3 – wenn der eingegebene Text kürzer ist, löst die Anfrage keine Fehler aus, da queryString gesetzt, aber leer ist. |
plugin.tx_solrsolr_pi1.view.partial & plugin.tx_solrsolr_pi1.view.templateFile
|
TypoScript für das Frontend-Plugin | Stellen Sie sicher, dass die Version, die Sie verwenden, die suggestion.html-Partial-Datei enthält (oder was auch immer die Extension für den JS-Code verwendet). Wenn die Datei fehlt, führt der JavaScript-Code manchmal eine leere Anfrage aus. |
Wenn Sie einen neuen TYPO3-Standort eingerichtet haben, enthält die ApacheSolrForTypo3-Extension oft eine Configuration/TypoScript/Setup.typoscript-Datei. Löschen Sie alle nil oder 0-Werte, die suggestUri oder addSelfParams überschreiben.
4.4. Aktivieren Sie Debugging und überprüfen Sie die Anfrage erneut ¶
-
Aktualisieren Sie
typo3conf/LocalConfiguration.php(falls nicht bereits geschehen):<?php $GLOBALS['TYPO3_CONF_VARS']['SYS']['setFileMode'] = 0666; $GLOBALS['TYPO3_CONF_VARS']['DEBUG']['whitespace'] = 1; $GLOBALS['TYPO3_CONF_VARS']['LOG']['requestErrorHandler'] = 1; -
Aktivieren Sie den „Auflisten von Anfragen“-Handler (oder ein benutzerdefiniertes Logging):
$GLOBALS['TYPO3_CONF_VARS']['SYS']['requestErrorHandler'] = \TYPO3\CMS\Core\Core\ErrorHandler::class . '::throwException'; -
Rufen Sie die Seite erneut auf und suchen Sie erneut in den Netzwerk/Tabellen nach
suggest. Sie sollten nur noch Anfragen mitqueryStringsehen (oder keine Anfragen, wenn die Autovervollständigungs-JS korrekt deaktiviert wurde). -
Überprüfen Sie die Backend-„Systemlog“-Ansicht (
TYPO3_CM4-...Tabelle) nachRequiredArgumentMissingExceptionfürSuggestController. Nach der Behebung des Problems wird dieser Eintrag verschwinden.
4.5. Optional – Wenn Sie das RequiredArgumentMissingException-Verhalten der Extension global vermeiden möchten
¶
Wenn Sie niemals diesen Fehler erneut sehen möchten, können Sie die extbase-Validierung für diesen Controller umgehen:
-
Fügen Sie einen Comment-Block im
SuggestController-Klassendokument hinzuzufügen:/** * @ExtbaseAnnotation\Validate(argumentName="queryString", type="StringLength", options={"minimum"=1}) */Dieser Annotationstyp kann verwendet werden, um den Fehler auszulösen, aber Sie möchten ihn möglicherweise deaktivieren:
Fügen Sie Folgendes in
ext_localconf.phpder Extension hinzu (ersetzen SieApacheSolrForTypo3durch den Erweiterungs-Namespace):$GLOBALS['TYPO3_CONF_VARS']['EXT']['extensionBuilder']['ApacheSolrForTypo3']['controller']['ApacheSolrForTypo3\Solr\Controller\SuggestController']['validateArguments'] = false;Hinweis: Diese Methode ist höherer Grad und kann die externe API der Extension beeinträchtigen. Es wird dringend empfohlen, zunächst die Frontend-Probleme zu beheben.
4.6. Zusammenfassende Checkliste (zum Kopieren und Einfügen) ¶
- [ ] Identifizieren Sie die Anfrage, die fehlt tx_solrsolr_pi1[queryString] (Netzwerk-Tab).
- [ ] Öffnen Sie die JS-Vorlage/Partial-Datei (Normalerweise EXT:solr/Resources/Public/JavaScript/Autocomplete.js oder eine benutzerdefinierte Kopie).
- [ ] Stellen Sie sicher, dass die Anfrage nur ausgeführt wird, wenn `queryString.length > 0`.
- [ ] Stellen Sie sicher, dass die URL-Generierung den Platzhalter {queryString} enthält (oder die entsprechende TYPO3-Path-Erstellung).
- [ ] Überprüfen Sie die TypoScript-Konfiguration: plugin.tx_solrsolr_pi1.search.suggestUri = '{queryString}' und addSelfParams = 1.
- [ ] Löschen Sie den Cache, laden Sie die Seite neu und überprüfen Sie die Anfrage erneut.
- [ ] Aktualisieren Sie `SuggestController->suggestAction()`, um einen fehlenden/lesezeichenfreien Abfrage-String sicher zu behandeln (optional, aber empfohlen).
- [ ] Aktivieren Sie das Debugging (LOG/DEBUG) und überprüfen Sie das Backend-Systemlog erneut.
- [ ] Stellen Sie sicher, dass es keine überschriebenen Partial-Dateien (z. B. in Ihrer Site-Package) gibt, die den JavaScript-Code ersetzen und den Abfrage-String ignorieren.
5. Confidence-Level
90 % – Das Problem (fehlender queryString-Parameter) ist ein klar definiertes Extbase-Validierungs-Szenario, und die meisten TYPO3-Websites verwenden die exakt gleiche Anfrage-Route für Suchvorschläge. Die Schritte oben behandeln sowohl den Frontend-Code, die Konfiguration als auch den Controller, was die häufigsten Ursachen für das Problem abdeckt. Es besteht eine geringe Wahrscheinlichkeit, dass ein benutzerdefinierter CORS-Proxy oder ein unerwarteter CNAME den Parameter entfernt, aber dies würde sich in den HTTP-Anfrage-Headern zeigen; ein solches Szenario ist für eine typische TYPO3-Installation mit ApacheSolrForTypo3 unwahrscheinlich.
Zusammenfassung:
Die Ursache ist, dass die Anfrage, die den Vorschlags-Endpunkt aufruft, den erforderlichen
queryString-Parameter nicht setzt (oder eine leere Zeichenfolge sendet). Beheben Sie die Frontend-URL-
Generierung/JS-Logik, überprüfen Sie die TypoScript-suggestUri-Einstellung, löschen Sie den Cache und optionalen
Controller-Patch für eine sichere Behandlung leerer Abfragen. Sobald der Parameter immer übergeben wird, wird die
RequiredArgumentMissingException verschwinden.
Nichts anzuzeigen