Warum Architektur alles entscheidet (und Ihr Kaffee nicht mehr kalt wird)
\nStellen Sie sich vor, Sie bauen ein Haus. Sie könnten die Ziegel einfach irgendwie stapeln, mit Kaugummi zusammenkleben und hoffen, dass es bis zum Winter hält. Oder Sie planen Fundament, Wände und Dach so, dass das Haus sowohl einem Sturm als auch einem Familienbesuch standhält. In der PHP-Welt ist es genauso. Architekturmuster sind die Baupläne, die Ihren Code von „läuft ja irgendwie“ zu „läuft, skaliert und macht keinen Kaffee mehr kalt“ verwandeln.
\nAls ich anfing, mit PHP zu programmieren, waren meine Projekte monolithische Monster. In einer einzigen index.php-Datei lebten SQL-Abfragen, HTML-Markup und Geschäftslogik friedlich zusammen. Das funktionierte genau so lange, bis ein Kunde eine neue Funktion wollte. Dann brach die Hölle los. Heute zeige ich Ihnen, wie Sie diese Hölle vermeiden. Wir gehen die wichtigsten Architekturmuster in PHP durch – von Klassikern bis zu modernen Ansätzen. Los geht's!
MVC (Model-View-Controller): Der Urvater aller Muster
\nWenn Sie mit Laravel, Symfony oder Yii2 gearbeitet haben, kennen Sie bereits MVC. Es ist das grundlegende PHP-Architekturmuster, das eine Anwendung in drei Teile aufteilt:
\n- \n
- Model – Daten und Geschäftslogik (Datenbankzugriffe, Validierung, Berechnungen). \n
- View – Darstellung (HTML, Templates, JSON). \n
- Controller – die Verbindung: nimmt Anfragen entgegen, ruft das Model auf und übergibt Daten an die View. \n
MVC löst das Hauptproblem – die Trennung von Verantwortlichkeiten. Schluss mit SQL im HTML. Der Code wird lesbar, testbar und wartbar.
\n\nMVC-Beispiel in reinem PHP
\n// Model: User.php\nclass User {\n public function find(int $id): ?array {\n $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');\n $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');\n $stmt->execute([$id]);\n return $stmt->fetch() ?: null;\n }\n}\n\n// Controller: UserController.php\nclass UserController {\n public function show(int $id): void {\n $userModel = new User();\n $user = $userModel->find($id);\n if (!$user) {\n http_response_code(404);\n echo 'Benutzer nicht gefunden';\n return;\n }\n // Daten an die View übergeben\n require 'views/user.php';\n }\n}\n\n// View: views/user.php\n<h1><?= htmlspecialchars($user['name']) ?></h1>\n<p>E-Mail: <?= htmlspecialchars($user['email']) ?></p>\nWann verwenden: Für Webanwendungen mittlerer Komplexität. Bei einem einfachen Blog oder Onlineshop ist MVC die richtige Wahl. Aber Vorsicht: Wenn die Controller fett werden (Fat Controllers), verliert das Muster seinen Sinn.
\n\nActive Record: Einfachheit und Geschwindigkeit
\nDas Active Record-Muster bedeutet, dass ein Objekt gleichzeitig eine Datenbankzeile und die Geschäftslogik repräsentiert. Erinnern Sie sich an Laravel Eloquent oder Yii2 ActiveRecord? Genau das ist es. Jedes Model ist sowohl Datenbankabfrage als auch Validierungsregel und Beziehung.
\n\nActive Record-Beispiel (Eloquent-Stil)
\nclass User extends ActiveRecord {\n // Eigenschaften entsprechen den Tabellenspalten\n public int $id;\n public string $name;\n public string $email;\n\n public function save(): bool {\n // INSERT/UPDATE-Logik\n if ($this->id) {\n // UPDATE\n } else {\n // INSERT\n }\n return true;\n }\n\n public static function find(int $id): ?self {\n // SELECT * FROM users WHERE id = $id\n }\n}\n\n// Verwendung\n$user = new User();\n$user->name = 'Max';\n$user->email = 'max@example.com';\n$user->save(); // Einfach und verständlich\nVorteile: Schnell zu schreiben, intuitiv für Anfänger. Nachteile: Verstößt gegen das Single-Responsibility-Prinzip (SOLID). Das Model kennt sowohl die Daten als auch deren Speicherung. Für komplexe Projekte ist das oft nicht ideal.