Einleitung: REST oder GraphQL – der ewige Kampf um Geschwindigkeit und Flexibilität
\nHallo Entwickler! Wenn du jemals eine API in PHP geschrieben hast, bist du sicherlich auf das Dilemma gestoßen: Verwende ich das klassische REST oder das moderne GraphQL? Beide Ansätze lösen die gleiche Aufgabe – die Datenübertragung zwischen Client und Server –, aber sie tun dies auf grundlegend unterschiedliche Weise.
\nREST war lange Jahre der De-facto-Standard: einfach, verständlich, vorhersagbar. Aber mit der zunehmenden Komplexität von Frontends (React, Vue, mobile Apps) beschweren sich Entwickler immer häufiger über Overfetching (zu viele Daten in der Antwort) und Underfetching (mehrere Anfragen nötig, um die benötigten Informationen zu sammeln). Hier kommt GraphQL ins Spiel – eine Abfragesprache, die dem Client die Kontrolle darüber gibt, welche Daten genau abgerufen werden.
\nIn diesem Artikel werden wir nicht nur die Theorie auflisten. Wir nehmen reale PHP-Projekte (Laravel und Symfony), schreiben Code und schauen, was schneller und was bequemer ist. Los geht's!
\n\n1. REST API in PHP: Ein Klassiker, der nicht stirbt
\nWie es funktioniert
\nREST (Representational State Transfer) ist ein Architekturstil, bei dem jede Ressource (Benutzer, Artikel, Kommentar) ihre eigene URL hat. Der Client sendet HTTP-Anfragen (GET, POST, PUT, DELETE) und der Server gibt eine feste Datenstruktur zurück, normalerweise im JSON-Format.
\nBeispiel eines typischen REST-Endpunkts in PHP (ohne Framework):
\n// index.php - einfache REST API\nheader('Content-Type: application/json');\n\n$method = $_SERVER['REQUEST_METHOD'];\n$uri = $_SERVER['REQUEST_URI'];\n\nif ($method === 'GET' && $uri === '/api/users') {\n $users = [\n ['id' => 1, 'name' => 'Alexej', 'email' => 'alex@example.com'],\n ['id' => 2, 'name' => 'Maria', 'email' => 'maria@example.com']\n ];\n echo json_encode($users);\n}\n\nIn Laravel sieht das noch einfacher aus:
\n// routes/api.php\nRoute::get('/users', function () {\n return User::all(); // Wird automatisch in JSON serialisiert\n});\n\nVorteile von REST
\n- \n
- Einfaches Caching: HTTP-Caching (ETag, Last-Modified) funktioniert out-of-the-box. \n
- Einfache Fehlersuche: Jeder Browser oder curl zeigt die Antwort an. \n
- Stabilität: REST existiert seit dem Jahr 2000, Dokumentation und Tools (Postman, Swagger) sind bis zur Perfektion verfeinert. \n
Nachteile von REST
\n- \n
- Overfetching: Wenn der Client nur den Benutzernamen benötigt, erhält er trotzdem E-Mail, Telefon und Adresse. \n
- N+1-Problem: Um einen Benutzer und seine Beiträge zu erhalten, sind zwei Anfragen nötig (GET /users/1, GET /users/1/posts). \n
2. GraphQL in PHP: Wenn der Client König ist
\nWie es funktioniert
\nGraphQL ist keine Datenbank, sondern eine Schicht zwischen Client und Server. Der Client sendet eine POST-Anfrage an einen einzigen Endpunkt (normalerweise /graphql) mit einem Anfragekörper, in dem er beschreibt, welche Felder und Beziehungen benötigt werden. Der Server gibt genau das zurück, was angefordert wurde – kein Byte mehr.
Beispiel einer Implementierung in PHP mit der Bibliothek webonyx/graphql-php:
\n// schema.php\nuse GraphQL\\Type\\Definition\\ObjectType;\nuse GraphQL\\Type\\Definition\\Type;\n\n$userType = new ObjectType([\n 'name' => 'User',\n 'fields' => [\n 'id' => Type::int(),\n 'name' => Type::string(),\n 'email' => Type::string(),\n ]\n]);\n\n$queryType = new ObjectType([\n 'name' => 'Query',\n 'fields' => [\n 'user' => [\n 'type' => $userType,\n 'args' => ['id' => Type::int()],\n 'resolve' => function ($root, $args) {\n return findUserById($args['id']); // Ihre Logik\n }\n ]\n ]\n]);\n\nUnd nun die Anfrage vom Client:
\n// Anf