Problem
Alle REST v1 Endpoints für Lieferadressen (/v1/lieferadressen) geben HTTP 500 zurück — GET, POST, PUT und DELETE sind betroffen. Der Fehler tritt beim Laden der Klasse auf, nicht erst beim Aufruf einer Methode.
Ursache
DeliveryAddressResource::insert() hat eine inkompatible Methoden-Signatur mit der Parent-Klasse:
// classes/Modules/Api/Resource/DeliveryAddressResource.php Zeile 124:
public function insert($inputVars)
// classes/Modules/Api/Resource/AbstractResource.php (Parent):
public function insert($inputVars, $inputMapping = null)
PHP 8.0+ erzwingt das Liskov-Substitution-Prinzip (LSP) und wirft einen Fatal Error wenn eine Child-Klasse eine Methode mit weniger Parametern überschreibt als die Parent-Klasse definiert:
Fatal error: Declaration of DeliveryAddressResource::insert($inputVars)
must be compatible with AbstractResource::insert($inputVars, $inputMapping = null)
Da PHP den Fehler beim Autoloading der Klasse auslöst, sind alle Endpoints betroffen — nicht nur POST/INSERT.
Reproduktion
curl --digest -u "user:pass" "http://localhost/api/index.php/v1/lieferadressen"
# → HTTP 500: {"error":{"code":7499,"message":"Unexpected error"}}
curl --digest -u "user:pass" -X POST "http://localhost/api/index.php/v1/lieferadressen" \
-H "Content-Type: application/json" \
-d '{"name":"Test","adresse":"3","land":"DE"}'
# → HTTP 500: {"error":{"code":7499,"message":"Unexpected error"}}
Fix
Eine Zeile in classes/Modules/Api/Resource/DeliveryAddressResource.php:
- public function insert($inputVars)
+ public function insert($inputVars, $inputMapping = null)
Hinweis
Es gibt möglicherweise weitere Stellen im Codebase mit ähnlichen Signatur-Inkompatibilitäten, die unter PHP 7.x nur Warnings waren aber unter PHP 8.x zu Fatal Errors werden. Ein Projekt-weiter Check wäre sinnvoll:
grep -rn "public function insert(\$inputVars)" classes/Modules/Api/Resource/
Umgebung
- OpenXE v1.12
- PHP 8.1 (Ubuntu 22.04)
- Betrifft alle PHP 8.0+ Installationen
Problem
Alle REST v1 Endpoints für Lieferadressen (
/v1/lieferadressen) geben HTTP 500 zurück — GET, POST, PUT und DELETE sind betroffen. Der Fehler tritt beim Laden der Klasse auf, nicht erst beim Aufruf einer Methode.Ursache
DeliveryAddressResource::insert()hat eine inkompatible Methoden-Signatur mit der Parent-Klasse:PHP 8.0+ erzwingt das Liskov-Substitution-Prinzip (LSP) und wirft einen Fatal Error wenn eine Child-Klasse eine Methode mit weniger Parametern überschreibt als die Parent-Klasse definiert:
Da PHP den Fehler beim Autoloading der Klasse auslöst, sind alle Endpoints betroffen — nicht nur POST/INSERT.
Reproduktion
Fix
Eine Zeile in
classes/Modules/Api/Resource/DeliveryAddressResource.php:Hinweis
Es gibt möglicherweise weitere Stellen im Codebase mit ähnlichen Signatur-Inkompatibilitäten, die unter PHP 7.x nur Warnings waren aber unter PHP 8.x zu Fatal Errors werden. Ein Projekt-weiter Check wäre sinnvoll:
grep -rn "public function insert(\$inputVars)" classes/Modules/Api/Resource/Umgebung