Projekt

Allgemein

Profil

Aktionen

Bug #75

offen

[Bugsink] Exception: Call to a member function format() on null

Von Bug Sink vor etwa 1 Monat hinzugefügt.

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

0%

Geschätzter Aufwand:

Beschreibung

Bugsink: https://bugsink.cytrus.de/issues/issue/ed1a00f1-0309-4ad2-867c-d04a6fe3aaea/event/last/

Typ: NEW issue

Projekt: www-rietberg-de

Bugsink Alert

Exception: Call to a member function format() on null


Automatisch erstellt durch n8n

KI-Analyse:

Analyse des Fehlers: Call to a member function format() on null


1. Ursache identifizieren

Der Fehler tritt auf, wenn versucht wird, die Methode format() auf einem null-Wert aufzurufen. Dies deutet darauf hin, dass ein DateTime-Objekt oder ein ähnliches Objekt mit einer format()-Methode erwartet wird, aber stattdessen null übergeben wurde.

Kontext aus dem Stacktrace:

  • Der Fehler stammt aus /public/index.php (Zeile 21), wo eine Closure (anonyme Funktion) aufgerufen wird.
  • Die Ausführung läuft durch die TYPO3-Core-Middleware (MiddlewareDispatcher, VerifyHostHeader, NormalizedParamsAttribute), was darauf hindeutet, dass der Fehler während der Request-Verarbeitung auftritt.
  • Der Fehler tritt nicht direkt im Core auf, sondern in benutzerdefiniertem Code (index.php oder eine darin eingebundene Extension).

Wahrscheinliche Szenarien:

  1. Fehlende oder ungültige Datumsangabe in einer Extension:

    • Eine Extension versucht, ein DateTime-Objekt zu formatieren, aber die zugrundeliegende Datenbank-Spalte oder Konfiguration enthält NULL.
    • Beispiel:
      $date = $record['date_field']; // NULL
      echo $date->format('Y-m-d'); // Fehler!
      
  2. Falsche Initialisierung eines DateTime-Objekts:

    • Ein DateTime-Objekt wird mit einem ungültigen String initialisiert (z. B. leerer String oder NULL).
    • Beispiel:
      $date = new \DateTime($invalidDateString); // $invalidDateString ist NULL oder leer
      echo $date->format('Y-m-d'); // Fehler, wenn $date NULL ist
      
  3. Middleware oder Hook, der ein DateTime-Objekt erwartet:

    • Ein Hook oder eine Middleware (z. B. in einer Extension) erwartet ein DateTime-Objekt, erhält aber NULL.
    • Beispiel:
      // In einer Extension:
      public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface {
          $date = $request->getAttribute('some_date_attribute'); // NULL
          $formattedDate = $date->format('Y-m-d'); // Fehler!
          // ...
      }
      
  4. TYPO3-Core-Funktionalität mit falschen Annahmen:

    • Selten, aber möglich: Ein Core-Service oder eine Core-Methode gibt NULL zurück, obwohl ein DateTime-Objekt erwartet wird.
    • Beispiel: TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\DateTime::class) könnte NULL zurückgeben, wenn die Initialisierung fehlschlägt.

2. Fix beschreiben (konkret)

Allgemeine Lösung:

  • Null-Check vor format() einfügen:
    if ($date !== null) {
        $formattedDate = $date->format('Y-m-d');
    } else {
        $formattedDate = ''; // oder Default-Wert
    }
    

Spezifische Lösungen je nach Szenario:

  1. Für Extension-Code (z. B. in index.php oder einer Controller-Action):

    • Prüfen, wo das DateTime-Objekt erzeugt wird und sicherstellen, dass es nicht NULL ist.
    • Beispiel:
      // Vorher:
      $date = $this->getDateFromSomewhere();
      $formatted = $date->format('Y-m-d');
      
      // Nachher:
      $date = $this->getDateFromSomewhere();
      $formatted = $date ? $date->format('Y-m-d') : 'Kein Datum';
      
  2. Für Middleware/Hooks:

    • Prüfen, ob das Attribut im Request existiert und gültig ist.
    • Beispiel:
      $date = $request->getAttribute('some_date_attribute');
      if ($date instanceof \DateTime) {
          $formattedDate = $date->format('Y-m-d');
      }
      
  3. Für Datenbank-Felder:

    • Prüfen, ob das Feld in der Datenbank NULL enthält und ggf. einen Default-Wert setzen.
    • Beispiel (Extbase):
      /**
       * @var \DateTime|null
       */
      protected $dateField;
      
      public function getFormattedDate(): string {
          return $this->dateField ? $this->dateField->format('Y-m-d') : '';
      }
      
  4. Für Core-Services:

    • Falls der Fehler im Core auftritt (unwahrscheinlich), prüfen, ob ein Patch verfügbar ist oder ein Bug-Report erstellt werden muss.

3. Betroffene TYPO3 Extension nennen

Der Fehler stammt nicht aus dem TYPO3-Core, sondern aus:

  • Benutzerdefiniertem Code in /public/index.php (Zeile 21) oder
  • Einer Extension, die in index.php eingebunden ist (z. B. eine Site-Package-Extension oder eine Drittanbieter-Extension).

Mögliche Kandidaten:

  1. Site-Package-Extension:

    • Wenn das Projekt eine eigene Extension für die Site-Logik hat (z. B. sitepackage oder myproject), könnte der Fehler dort liegen.
    • Beispiel: Ein Controller oder Hook in der Extension versucht, ein DateTime-Objekt zu formatieren.
  2. Drittanbieter-Extension:

    • Eine Extension wie news, calendar, eventmanagement oder eine andere, die mit Datumsfeldern arbeitet.
    • Beispiel: Die Extension news könnte ein NULL-Datum aus der Datenbank lesen und versuchen, es zu formatieren.
  3. Custom Middleware:

    • Falls das Projekt eigene Middleware registriert hat, könnte diese den Fehler verursachen.

Wie man die Extension identifiziert:

  • Stacktrace analysieren:
    • Der Fehler tritt in /public/index.php auf, aber die eigentliche Ursache liegt in einer Extension, die dort eingebunden ist.
    • Prüfen, welche Extensions in index.php geladen werden (z. B. über require oder TYPO3\CMS\Core\Utility\ExtensionManagementUtility::loadBaseTca()).
  • Debugging:
    • In /public/index.php (Zeile 21) einen Breakpoint setzen und prüfen, welcher Code die format()-Methode aufruft.
    • Beispiel:
      // In index.php (Zeile 20-21):
      $result = $closure(); // Hier wird der Fehler ausgelöst
      
      • Die Closure könnte aus einer Extension stammen.

4. Confidence (0-100%)

  • 90% Confidence, dass der Fehler in einer benutzerdefinierten Extension oder index.php liegt.
  • 10% Confidence, dass der Fehler im TYPO3-Core liegt (unwahrscheinlich, da der Core robust gegen solche Fälle ist).

Zusammenfassung der nächsten Schritte

  1. Debugging in index.php:

    • Prüfen, welche Closure in Zeile 21 aufgerufen wird und woher sie kommt.
    • Beispiel:
      // In index.php:
      $closure = function() {
          // Hier wird der Fehler ausgelöst
          $date = $this->getDate(); // NULL
          return $date->format('Y-m-d'); // Fehler!
      };
      
  2. Extension-Code prüfen:

    • Alle Stellen in Extensions durchsuchen, wo format() auf einem DateTime-Objekt aufgerufen wird.
    • Beispiel-Befehl für die Suche:
      grep -r "\->format(" typo3conf/ext/
      
  3. Null-Checks einbauen:

    • An allen kritischen Stellen prüfen, ob das DateTime-Objekt NULL ist, bevor format() aufgerufen wird.
  4. Datenbank prüfen:

    • Falls der Fehler in einer Extension mit Datenbank-Zugriff auftritt, prüfen, ob die betroffenen Felder NULL enthalten und ob dies erlaubt sein soll.
  5. TYPO3-Logs prüfen:

    • In typo3temp/var/logs/ nach weiteren Hinweisen suchen (z. B. typo3_*.log).

Beispiel-Fix für eine Extension

Vorher (fehlerhaft):

// In einer Extension (z. B. Controller):
public function showAction(MyModel $model): ResponseInterface {
    $date = $model->getDateField();
    $formattedDate = $date->format('Y-m-d'); // Fehler, wenn $date NULL ist
    $this->view->assign('date', $formattedDate);
    return $this->htmlResponse();
}

Nachher (korrigiert):

public function showAction(MyModel $model): ResponseInterface {
    $date = $model->getDateField();
    $formattedDate = $date ? $date->format('Y-m-d') : ''; // Null-Check
    $this->view->assign('date', $formattedDate);
    return $this->htmlResponse();
}

Fazit

Der Fehler ist kein Core-Bug, sondern entsteht durch fehlende Null-Prüfungen in benutzerdefiniertem Code. Die Lösung besteht darin:

  1. Die betroffene Stelle in index.php oder der Extension zu finden.
  2. Einen Null-Check vor dem format()-Aufruf einzubauen.
  3. Falls nötig, die Datenbank oder die Logik anzupassen, um NULL-Werte zu vermeiden.

Nichts anzuzeigen

Aktionen

Auch abrufbar als: Atom PDF