Projekt

Allgemein

Profil

Aktionen

Bug #152

offen

[Bugsink] TYPO3\CMS\Extbase\Mvc\Controller\Exception\RequiredArgumentMissingException: Required argument "queryString" is not set for ApacheSolrForTypo3\Solr\C…

Von Bug Sink vor etwa 2 Monaten hinzugefügt.

Status:
Neu
Priorität:
wichtig
Zugewiesen an:
-
Beginn:
03.09.2026
Abgabedatum:
% erledigt:

0%

Geschätzter Aufwand:

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

  1. Aktivieren Sie die Logging-Funktion (falls nicht bereits geschehen)

    • Setzen Sie TYPO3_DEBUG auf 2 (oder verwenden Sie den neuen typo3.conf.php-Parameter LOG_REQUESTS).
    • Rufen Sie die Seite auf, die die Autovervollständigungs-JS auslöst (z. B. search.html).
  2. Führen Sie eine Browser-Network-Anzeige durch (F12 → Netzwerk) und filtern Sie nach suggest.

  3. 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]=suggest
    

    Wenn 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).
  4. Problem beheben:

    • Fall A – Leerer Abfrage-String
      Die JS-Routine erstellt url = url + '&tx_solrsolr_pi1[queryString]=' + encodeURIComponent(query); wobei query undefiniert oder eine leere Zeichenfolge ist.
      Lösung: Stellen Sie sicher, dass query eine 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
      In setup.typoscript (oder Constants.typoscript) hat der Eintrag plugin.tx_solrsolr_pi1.search.suggestUri oft 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 (clearCache im 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

  1. 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;
    
  2. Aktivieren Sie den „Auflisten von Anfragen“-Handler (oder ein benutzerdefiniertes Logging):

    $GLOBALS['TYPO3_CONF_VARS']['SYS']['requestErrorHandler'] = \TYPO3\CMS\Core\Core\ErrorHandler::class . '::throwException';
    
  3. Rufen Sie die Seite erneut auf und suchen Sie erneut in den Netzwerk/Tabellen nach suggest. Sie sollten nur noch Anfragen mit queryString sehen (oder keine Anfragen, wenn die Autovervollständigungs-JS korrekt deaktiviert wurde).

  4. Überprüfen Sie die Backend-„Systemlog“-Ansicht (TYPO3_CM4-... Tabelle) nach RequiredArgumentMissingException für SuggestController. 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.php der Extension hinzu (ersetzen Sie ApacheSolrForTypo3 durch 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

Aktionen

Auch abrufbar als: Atom PDF