20.4.5. Controller-Klassen

Wie im Kapitel vorher beschrieben kann es manchmal nötig sein, eigene REST-API-Controller-Klassen zu erstellen oder auf die vorhandenen aufzubauen.

Controller-Klassen nehmen Anfragen eines Endpunkts entgegen, verarbeiten diese und geben danach etwas zurück. Alle von WordPress gelieferten Controller lassen sich in so genannte Infrastruktur- oder Endpunkt-Klassen unterscheiden. Dabei gilt:

Die WP_REST_Server-Klasse ist der Infrastrukturcontroller. Zu seinen Aufgaben gehören:

  1. Registrierung der Routen;
  2. Authentifizierung;
  3. Request-Validierung mit Erstellung eines WP_REST_Request-Objekts;
  4. Rechte-Checks;
  5. sowie Durchreichen der Anfrage an die Sub-Controller.

Wenn WP_REST_Server eine Anfrage erhält, generiert es ein WP_REST_Request-Objekt, welches dann an einen Sub-Controller durchgereicht wird. Das Objekt enthält alle Daten der ursprünglichen Anfrage. Das sind z.B. Header- und Formulardaten.

Erhält ein Sub-Controller die Anfrage, reicht er diese an seine entsprechenden Methoden weiter. Er entscheidet dies anhand der im WP_REST_Request-Objekt enthaltenen Daten. Die einzelnen Methoden wären dann die Endpunkte selbst. Deshalb nennt man die Sub-Controller dann auch Endpunkt-Controller.

Nehmen wir als Beispiel den in WordPress enthaltenen Artikeltyp post. Hier wäre die Klasse WP_REST_Posts_Controller der Endpunkt-Controller welcher von WP_REST_Server aufgerufen wird, wenn eine Anfrage an diesen Artikeltyp gestellt wird.

WP_REST_Posts_Controller erweitert die Klasse WP_REST_Controller um seine spezifischen Endpunkte (Methoden) zur Verarbeitung der Anfragen. Senden wir beispielhaft eine Anfrage an wp/v2/posts wird sie an die dortige Methode get_items() geschickt. Diese kümmert sich um die eigentliche Datenbank-Abfrage und sendet dann ein Objekt der Klasse WP_REST_Response zurück.

Mit WP_REST_Response schließt sich dann letztlich der Kreis. Sie erweitert die Klasse WP_HTTP_Response welche letztlich alle Daten enthält, die an das anfragende System zurück übermittelt werden sollen. Das sind zum einen natürlich die Daten selbst (in unserem Beispiel also eine gewisse Anzahl an Blogbeiträgen) aber auch zusätzliche Header-Daten wie der Status-Code.

Wer nun einen benutzerdefinierten Artikeltyp erstellt, kann die REST-API dazu zwingen, einen eigenen Controller statt den bisherigen zu verwenden. Zur Erinnerung: der Endpunkt-Controller für alle Inhaltstypen ist normalerweise die Klasse WP_REST_Posts_Controller. Man kann aber natürlich von dieser Klasse, oder aber auch von WP_REST_Controller ableiten um den eigenen Endpunkt-Controller zu entwerfen. Sehen wir uns beides einmal an.