mvc guide, its also in flatnotes under Backend MVC

This commit is contained in:
Bruno Eckhardt committed 2026-05-21 13:06:24 +02:00
1 parent f61d0ea8fe
commit 80b31284ab
1 file changed
+125
+125
View File
@@ -0,0 +1,125 @@
# 🏗️ Backend MVC Dokumentation
Dieses Projekt nutzt eine moderne **Model-View-Controller (MVC)** Struktur mit einem **modularen Block-Layout**. Dies trennt die Geschäftslogik vom Design und macht den Code wartbar und erweiterbar.
---
## 📁 Verzeichnisstruktur
- `WEBROOT/src/MVC/Core/`: Basisklassen (`Controller`, `View`).
- `WEBROOT/src/MVC/Controller/`: Hier liegt die Logik (PHP-Klassen).
- `WEBROOT/src/MVC/View/`: Hier liegen die Templates (HTML/PHP).
- `WEBROOT/src/MVC/Layout/`: Das globale Layout-System und die Blöcke.
- `WEBROOT/index.php`: Der "Entry Point", der alles zusammenfügt.
---
## 🚀 Einen neuen Service erstellen
1. **Dateien anlegen:** Nutze das Script `php create_module.php <name>`.
2. **Controller registrieren:** Trage den neuen Controller in der `$controllers`-Liste in `WEBROOT/index.php` ein.
3. **In Config eintragen:** Füge den Service in der `config.php` (oder über die Admin-Oberfläche) hinzu, damit er in der Sidebar erscheint.
---
## 💡 Arbeiten mit Controller & View
### Daten vom Controller an die View übergeben
Im Controller nutzt du die `render()` Methode:
```php
public function mein_service() {
$userCount = 42;
return $this->render('meine_view', [
'anzahl' => $userCount,
'status' => 'aktiv'
]);
}
```
In der View (`meine_view.php`) sind diese Variablen direkt verfügbar:
```html
<p>Es sind <?= $anzahl ?> Benutzer im Status <?= $status ?>.</p>
```
---
## 🛠️ Mehrere Funktionen in einer View nutzen
Wenn du innerhalb eines Projekts verschiedene Aktionen ausführen willst (z.B. Anzeigen, Bearbeiten, Löschen), gibt es zwei gängige Wege:
### 1. Über URL-Parameter (Empfohlen für einfache Logik)
Du nutzt einen Parameter wie `?action=edit` in deinen Links.
**Im Controller:**
```php
public function mein_service() {
$action = $_GET['action'] ?? 'list';
$data = [];
if ($action === 'edit') {
$data = ["mode" => "Bearbeiten"];
} else {
$data = ["mode" => "Listenansicht"];
}
return $this->render('mein_view', $data);
}
```
### 2. Formular-Aktionen (POST)
Wenn du Buttons für verschiedene Funktionen hast, kannst du diese im Controller abfangen:
**In der View:**
```html
<form method="POST">
<button type="submit" name="save_data">Speichern</button>
<button type="submit" name="delete_data">Löschen</button>
</form>
```
**Im Controller:**
```php
public function mein_service() {
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['save_data'])) {
// Logik für Speichern
}
if (isset($_POST['delete_data'])) {
// Logik für Löschen
}
// Nach POST immer Redirect, um "F5-Resubmit" zu verhindern
header("Location: ?service=mein_service");
exit;
}
return $this->render('mein_view');
}
```
---
## 🧱 Das Block-Layout System
Das Layout besteht aus Blöcken. In der `index.php` kannst du diese Blöcke füllen, bevor das Layout gerendert wird:
- `title`: Der Tab-Titel.
- `header`: Der obere Balken.
- `sidebar`: Das Seitenmenü.
- `content`: Der Hauptinhalt (kommt meist aus dem Controller).
- `scripts`: Zusätzliches JavaScript für die Seite.
Beispiel für zusätzliche Scripte im Controller:
```php
// In index.php könnte man das Layout erweitern:
$layout->setBlock('scripts', '<script src="mein_script.js"></script>');
```
---
## ⚠️ Wichtige Regeln (Best Practices)
1. **Kein HTML im Controller:** Controller bereiten nur Daten vor. HTML gehört ausschließlich in die `View`.
2. **Globale Klassen:** Nutze `\` vor globalen Funktionen oder Klassen (z.B. `\DatabaseShow()`), wenn du dich innerhalb eines Namespaces befindest.
3. **Security:** Nutze immer `htmlspecialchars()` beim Ausgeben von Variablen in der View, um XSS-Angriffe zu verhindern.
4. **Redirects:** Nach einem `POST` (Daten speichern) solltest du immer ein `header("Location: ...")` machen, damit die Seite beim Neuladen die Daten nicht doppelt sendet.
5. **Namespaces:** Achte darauf, dass neue Controller immer `namespace MVC\Controller;` am Anfang stehen haben.