Files
michaelschiemer/docs/architecture/components.md
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

14 KiB

Hauptkomponenten

Diese Dokumentation beschreibt die Hauptkomponenten des Frameworks und ihre Verantwortlichkeiten. Jede Komponente ist so konzipiert, dass sie unabhängig verwendet oder durch eine benutzerdefinierte Implementierung ersetzt werden kann.

Kernkomponenten

Container

Der Container ist das Herzstück des Frameworks und verantwortlich für die Dependency Injection. Er bietet folgende Funktionen:

  • Registrierung von Diensten
  • Auflösung von Abhängigkeiten
  • Verwaltung des Lebenszyklus von Diensten
// Beispiel für die Verwendung des Containers
$container = new Container();
$container->bind(LoggerInterface::class, FileLogger::class);
$container->singleton(DatabaseInterface::class, function () {
    return new Database(config('database'));
});

$logger = $container->get(LoggerInterface::class);

Router

Der Router ist verantwortlich für das Mapping von HTTP-Anfragen zu Controller-Aktionen. Er unterstützt:

  • Routendefinitionen für verschiedene HTTP-Methoden
  • Routengruppen mit gemeinsamen Präfixen und Middleware
  • Routenparameter und Einschränkungen
  • Namensräume für Routen
// Beispiel für die Verwendung des Routers
$router = new Router();
$router->get('/users', [UserController::class, 'index']);
$router->post('/users', [UserController::class, 'store']);
$router->get('/users/{id}', [UserController::class, 'show'])->where('id', '[0-9]+');

$router->group('/admin', function (Router $router) {
    $router->get('/dashboard', [AdminController::class, 'dashboard']);
})->middleware(AuthMiddleware::class);

Request

Die Request-Klasse kapselt eine HTTP-Anfrage und bietet Methoden für den Zugriff auf:

  • Anfrageparameter
  • Header
  • Cookies
  • Dateien
  • Sitzungsdaten
// Beispiel für die Verwendung der Request-Klasse
$name = $request->input('name');
$page = $request->query('page', 1);
$token = $request->header('Authorization');
$file = $request->file('avatar');
$remember = $request->cookie('remember', false);
$user = $request->session()->get('user');

Response

Die Response-Klasse repräsentiert eine HTTP-Antwort und bietet Methoden für:

  • Setzen von Statuscodes
  • Hinzufügen von Headern
  • Setzen von Cookies
  • Umleitung zu anderen URLs
// Beispiel für die Verwendung der Response-Klasse
$response = new Response('Hello World', 200);
$response->header('Content-Type', 'text/plain');
$response->cookie('visited', true, 60 * 24);

$redirectResponse = new RedirectResponse('/dashboard');
$jsonResponse = new JsonResponse(['name' => 'John']);
$viewResponse = new ViewResponse('welcome', ['user' => $user]);

Middleware

Middleware-Komponenten verarbeiten Anfragen vor und nach der Controller-Aktion. Sie können:

  • Anfragen validieren
  • Benutzer authentifizieren
  • Antworten transformieren
  • Anfragen protokollieren
// Beispiel für eine Middleware
class AuthMiddleware implements MiddlewareInterface
{
    public function process(Request $request, RequestHandlerInterface $handler): Response
    {
        if (!$this->isAuthenticated($request)) {
            return new RedirectResponse('/login');
        }
        
        return $handler->handle($request);
    }
}

Datenbankkomponenten

Database

Die Database-Komponente bietet eine Abstraktionsschicht für Datenbankoperationen. Sie unterstützt:

  • Verschiedene Datenbanktypen (MySQL, SQLite, PostgreSQL)
  • Abfragen mit einem Query Builder
  • Transaktionen
  • Migrationen
  • Seeding
// Beispiel für die Verwendung der Database-Komponente
$users = $database->table('users')
    ->where('active', true)
    ->orderBy('name')
    ->limit(10)
    ->get();

$database->transaction(function ($db) {
    $db->table('users')->insert(['name' => 'John']);
    $db->table('profiles')->insert(['user_id' => $db->lastInsertId()]);
});

Model

Die Model-Komponente bietet eine objektorientierte Schnittstelle für Datenbankoperationen. Sie unterstützt:

  • Active Record Pattern
  • Beziehungen zwischen Modellen
  • Attribute und Mutators
  • Ereignisse
// Beispiel für die Verwendung der Model-Komponente
$user = new User();
$user->name = 'John';
$user->email = 'john@example.com';
$user->save();

$users = User::where('active', true)->get();
$user = User::find(1);
$posts = $user->posts()->where('published', true)->get();

Migration

Die Migration-Komponente ermöglicht die Versionierung der Datenbankstruktur. Sie unterstützt:

  • Erstellen und Ändern von Tabellen
  • Hinzufügen und Entfernen von Indizes
  • Rollback von Änderungen
// Beispiel für eine Migration
class CreateUsersTable extends Migration
{
    public function up(): void
    {
        $this->schema->create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->boolean('active')->default(true);
            $table->timestamps();
        });
    }

    public function down(): void
    {
        $this->schema->dropIfExists('users');
    }
}

HTTP-Komponenten

Controller

Controller sind verantwortlich für die Verarbeitung von HTTP-Anfragen und die Rückgabe von Antworten. Sie bieten:

  • Zugriff auf Request- und Response-Objekte
  • Validierung von Eingaben
  • Rendering von Views
  • Umleitung zu anderen URLs
// Beispiel für einen Controller
class UserController extends Controller
{
    public function index(Request $request): Response
    {
        $users = User::all();
        return $this->view('users.index', ['users' => $users]);
    }

    public function store(Request $request): Response
    {
        $this->validate($request, [
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users,email',
        ]);

        $user = User::create($request->only(['name', 'email']));
        return $this->redirect('/users')->with('success', 'User created');
    }
}

View

Die View-Komponente ist verantwortlich für das Rendering von HTML-Templates. Sie unterstützt:

  • Template-Dateien mit PHP-Syntax
  • Layouts und Partials
  • Template-Vererbung
  • Datenübergabe an Templates
// Beispiel für die Verwendung der View-Komponente
$view = new View('users.show');
$view->with('user', $user);
$html = $view->render();

// Oder über den Controller
return $this->view('users.show', ['user' => $user]);

Session

Die Session-Komponente verwaltet Benutzersitzungen. Sie unterstützt:

  • Verschiedene Session-Backends (Datei, Datenbank, Redis)
  • Flash-Daten
  • Session-Regeneration
  • Session-Timeout
// Beispiel für die Verwendung der Session-Komponente
$session = new Session();
$session->put('user_id', 1);
$userId = $session->get('user_id');
$session->flash('message', 'Welcome back!');
$session->regenerate();
$session->forget('user_id');

Die Cookie-Komponente verwaltet HTTP-Cookies. Sie unterstützt:

  • Setzen und Lesen von Cookies
  • Verschlüsselung von Cookie-Werten
  • Cookie-Parameter (Lebensdauer, Pfad, Domain, Secure, HttpOnly)
// Beispiel für die Verwendung der Cookie-Komponente
$cookie = new Cookie('name', 'value', 60 * 24); // 1 Tag
$cookie->setPath('/');
$cookie->setSecure(true);
$cookie->setHttpOnly(true);

$response->setCookie($cookie);
$value = $request->cookie('name');

Sicherheitskomponenten

Validator

Die Validator-Komponente validiert Benutzereingaben. Sie unterstützt:

  • Verschiedene Validierungsregeln
  • Benutzerdefinierte Validierungsregeln
  • Fehlermeldungen
  • Validierung von Arrays und verschachtelten Daten
// Beispiel für die Verwendung der Validator-Komponente
$validator = new Validator($data, [
    'name' => 'required|string|max:255',
    'email' => 'required|email|unique:users,email',
    'password' => 'required|string|min:8|confirmed',
    'age' => 'integer|min:18',
]);

if ($validator->fails()) {
    $errors = $validator->errors();
    // Fehler behandeln
}

Authentication

Die Authentication-Komponente verwaltet die Benutzerauthentifizierung. Sie unterstützt:

  • Verschiedene Authentifizierungsmethoden (Session, Token, Basic)
  • Mehrere Authentifizierungsquellen
  • Remember-Me-Funktionalität
  • Passwort-Hashing und -Verifizierung
// Beispiel für die Verwendung der Authentication-Komponente
$auth = new Authentication();
if ($auth->attempt(['email' => $email, 'password' => $password], $remember)) {
    // Erfolgreiche Anmeldung
}

$user = $auth->user();
$auth->logout();

Authorization

Die Authorization-Komponente verwaltet die Benutzerautorisierung. Sie unterstützt:

  • Rollenbasierte Zugriffskontrolle
  • Fähigkeitsbasierte Zugriffskontrolle
  • Richtlinien für komplexe Autorisierungslogik
// Beispiel für die Verwendung der Authorization-Komponente
$authorization = new Authorization();
$authorization->define('edit-post', function (User $user, Post $post) {
    return $user->id === $post->user_id || $user->hasRole('editor');
});

if ($authorization->can($user, 'edit-post', $post)) {
    // Benutzer darf den Beitrag bearbeiten
}

CSRF

Die CSRF-Komponente schützt vor Cross-Site Request Forgery. Sie unterstützt:

  • Generierung von CSRF-Tokens
  • Validierung von CSRF-Tokens
  • Automatische Integration in Formulare
// Beispiel für die Verwendung der CSRF-Komponente
$csrf = new CsrfProtection();
$token = $csrf->generateToken();

// In einem Formular
echo '<input type="hidden" name="_token" value="' . $token . '">';

// Validierung
if (!$csrf->validateToken($request->input('_token'))) {
    // Ungültiges Token
}

WAF

Die Web Application Firewall (WAF) schützt vor gängigen Angriffen. Sie unterstützt:

  • Erkennung und Blockierung von SQL-Injection
  • Erkennung und Blockierung von XSS
  • Erkennung und Blockierung von Command Injection
  • Erkennung und Blockierung von Path Traversal
  • Maschinelles Lernen zur Erkennung von Anomalien
// Beispiel für die Verwendung der WAF-Komponente
$waf = new WebApplicationFirewall();
$waf->addRule(new SqlInjectionRule());
$waf->addRule(new XssRule());

if ($waf->detect($request)) {
    // Angriff erkannt
    $waf->block($request);
}

Weitere Komponenten

Cache

Die Cache-Komponente bietet eine einheitliche Schnittstelle für verschiedene Cache-Backends. Sie unterstützt:

  • Verschiedene Cache-Treiber (Datei, Redis, Memcached, Memory)
  • Cache-Tags
  • Cache-Invalidierung
  • Cache-Prefixing
// Beispiel für die Verwendung der Cache-Komponente
$cache = new Cache();
$cache->put('key', 'value', 60); // 60 Minuten
$value = $cache->get('key', 'default');
$cache->has('key');
$cache->forget('key');
$cache->flush();

$cache->tags(['users', 'profiles'])->put('user:1', $user, 60);

Logger

Die Logger-Komponente protokolliert Anwendungsereignisse. Sie unterstützt:

  • Verschiedene Log-Level (Debug, Info, Warning, Error, Critical)
  • Verschiedene Log-Handler (Datei, Syslog, Slack, E-Mail)
  • Kontextdaten für Log-Einträge
  • Log-Rotation
// Beispiel für die Verwendung der Logger-Komponente
$logger = new Logger();
$logger->debug('Debug-Nachricht');
$logger->info('Info-Nachricht');
$logger->warning('Warnung', ['user_id' => 1]);
$logger->error('Fehler', ['exception' => $exception]);
$logger->critical('Kritischer Fehler', ['data' => $data]);

Event

Die Event-Komponente implementiert ein Publish-Subscribe-Muster. Sie unterstützt:

  • Ereignisregistrierung und -auslösung
  • Ereignislistener
  • Ereignisabonnenten
  • Ereignispriorisierung
// Beispiel für die Verwendung der Event-Komponente
$eventDispatcher = new EventDispatcher();
$eventDispatcher->addListener(UserRegistered::class, SendWelcomeEmail::class);
$eventDispatcher->addListener(UserRegistered::class, function (UserRegistered $event) {
    // Benutzerdefinierte Logik
});

$eventDispatcher->dispatch(new UserRegistered($user));

Console

Die Console-Komponente bietet ein Kommandozeilen-Interface für die Anwendung. Sie unterstützt:

  • Benutzerdefinierte Befehle
  • Eingabeargumente und -optionen
  • Interaktive Eingabe
  • Ausgabeformatierung
// Beispiel für einen Konsolenbefehl
class MigrateCommand extends Command
{
    protected string $name = 'db:migrate';
    protected string $description = 'Run database migrations';

    public function handle(Input $input, Output $output): int
    {
        $output->writeln('Running migrations...');
        // Migrationen ausführen
        $output->success('Migrations completed successfully');
        return 0;
    }
}

Filesystem

Die Filesystem-Komponente bietet eine Abstraktionsschicht für Dateisystemoperationen. Sie unterstützt:

  • Lokale und entfernte Dateisysteme
  • Datei- und Verzeichnisoperationen
  • Dateimetadaten
  • Dateispeicherung und -abruf
// Beispiel für die Verwendung der Filesystem-Komponente
$filesystem = new Filesystem();
$filesystem->write('path/to/file.txt', 'Inhalt');
$content = $filesystem->read('path/to/file.txt');
$filesystem->delete('path/to/file.txt');
$filesystem->createDirectory('path/to/directory');
$files = $filesystem->listContents('path/to/directory');

Queue

Die Queue-Komponente ermöglicht die asynchrone Verarbeitung von Aufgaben. Sie unterstützt:

  • Verschiedene Queue-Treiber (Datenbank, Redis, Beanstalkd)
  • Verzögerte Aufgaben
  • Aufgabenpriorisierung
  • Fehlerbehandlung und Wiederholungsversuche
// Beispiel für die Verwendung der Queue-Komponente
$queue = new Queue();
$queue->push(new SendEmailJob($user, $message));
$queue->later(60, new CleanupJob()); // 60 Sekunden verzögert

// Verarbeitung einer Aufgabe
class SendEmailJob implements JobInterface
{
    public function __construct(private User $user, private string $message) {}

    public function handle(): void
    {
        // E-Mail senden
    }
}

Weitere Informationen