Je komplexer eine PHP-Anwendung wird, desto häufiger stellt sich die Frage: Wie leite ich dynamische Eingaben (z. B. Events, Kommandos, Typen) an die passende Logik weiter?
Typische Szenarien dafür sind:
Die meisten Entwickler beginnen mit if-/match-Blöcken. Das funktioniert – aber skaliert schlecht. In diesem Artikel zeige ich, wie du mit einem PHP-Attribut und einem Interface eine flexible, entkoppelte Struktur aufbaust, die auf automatischer Erkennung basiert – erklärt am Beispiel einer Webhook Client Integration.
Unser PHP-Entwickler zeigt dir, wie du Webhook-Events in PHP elegant und skalierbar verarbeitest - ein sehr technisches Thema. Perfekt für dich, wenn du Lust hast, deine Event-Logik von starren if-Statements zu befreien und smarte Discovery-Patterns kennenzulernen.
Um eingehende Webhook-Requests anhand des beigefügten Events einem Event-Handler zu ordnen zu können, kann schnell auf If-Statements zurückgegriffen werden:
Eine einfachere Version dessen kann, seit PHP 8, auch mit einem match-Statement umgesetzt werden:
Doch das wird schnell unübersichtlich:
Statt in if-Ketten oder langen match-Statements Events mit Event-Handlern zu verknüpfen, wollen wir:
1. Handler-Klassen mit einem Attribut versehen (z. B. #[Webhook('event.name')])
2. Ein gemeinsames Interface implementieren
3. Ein festgelegtes Verzeichnis bzw. Namespace rekursiv scannen
4. Den passenden Handler automatisch finden und aufrufen
Das Muster funktioniert nicht nur für Webhooks, sondern lässt sich auch übertragen auf:
Damit können Klassen mit einem bestimmten Event-Namen markiert werden. Diese Klassen sind dann für die Bearbeitung dieses Events zuständig.
Damit stellen wir sicher, dass alle Handler die gleiche Signatur haben und generisch aufgerufen werden können.
Kommen wir zur eigentlich Event-Handler-Klasse, die ein Event bearbeitet. Hier ist ein Beispiel wie solch eine Klasse aussehen könnte:
Jede Klasse:
Das Herzstück ist ein Service, der über Reflection passende Klassen findet:
Ob nur der erste gefundene Event-Handler oder alle gefundenen aufgerufen werden sollen, kann jeder Entwickler für sich entscheiden. In diesem Beispiel werden alle gefundenen Event-Handler ausgeführt.
Modular: Jeder Handler ist eine eigenständige Klasse
Modular: Jeder Handler ist eine eigenständige Klasse
Skalierbar: Neue Events = neue Datei, keine Änderungen am globalen Aufruf nötig
Skalierbar: Neue Events = neue Datei, keine Änderungen am globalen Aufruf nötig
Testbar: Handler lassen sich isoliert testen
Testbar: Handler lassen sich isoliert testen
Entkoppelt: Keine zentralisierte Routing-Logik
Entkoppelt: Keine zentralisierte Routing-Logik
Dynamisch: Events und Handler lassen sich zur Laufzeit erfassen
Dynamisch: Events und Handler lassen sich zur Laufzeit erfassen
Du kannst dieses Prinzip für jede beliebige Dispatch-Logik verwenden:
Immer gilt:
Kombiniere Attribute + Interface + Discovery = maximale Flexibilität
In dem Fall der Webhook Even-Handler habe ich beispielsweise eine Validierung anhand Laravels Validation-Klasse hinzugefügt, die vor der Bearbeitung aufgerufen werden kann und mitentscheidet, ob der Webhook-Request gespeichert bzw. bearbeitet werden soll.
Als Erstes wird dem Interface eine validate methode definiert:
Statt direkt das Interface in einem spezifischen Event-Handler zu implementieren, vererbt jeder Event-Handler von einem abstrakten Event-Handler, der die validation method inkludiert:
Im spezifischen Event-Handler wird zusätzlich definiert welche Regeln der Inhalt des Payloads einhalten soll:
Die Vaildate method kann, wie hier gezeigt, bspw. direkt in der handler method verwendet werden oder dort wo eingehende Webhook-Requests ausgewertet werden – bspw. so:
So können bereits vor dem Speichern des Webhook-Requests – wie es im Webhook-Profile des Laravel Webhook Client Packages von Spatie vorgesehen ist – jene Requests herausgefiltert werden, deren Payload inhaltlich nicht validiert werden konnte.
Das Zusammenspiel von PHP-Attributen, Interfaces und Discovery per Reflection bietet eine elegante Alternative zu klassischen if-/match-Konstrukten. Gerade in dynamischen Systemen wie Webhook-Integrationen, Plugins oder Event-Handling ist dieses Muster:
PHP-Entwickler
Phillip Kalusek
Phillips offene und kommunikative Art sowie seine PHP-Expertise bereichern unser Team. Sein Fachwissen zu Laravel bringt er nicht nur in Kundenprojekten ein, sondern er teilt es auch in Schulungen mit anderen Entwicklern.
Werde Teil unserer Laravel-Community
und entdecke unserer Meetups.
Zum Meetup