Einführung in PHP-DI: Was ist das und warum braucht man es?
PHP-DI (PHP Dependency Injection) ist eine leistungsstarke Bibliothek für die Abhängigkeitsinjektion (Dependency Injection, DI) in PHP-Anwendungen. Sie implementiert das Inversion-of-Control-Prinzip (IoC) und stellt einen Container bereit, der Abhängigkeiten zwischen Klassen automatisch auflöst.
Warum braucht man PHP-DI? In modernen PHP-Projekten (besonders mit Frameworks wie Laravel, Symfony, Slim) sind Klassen oft von anderen Klassen abhängig. Ohne einen DI-Container müssen Sie alle Abhängigkeiten manuell erstellen – das führt zu:
- Starker Kopplung des Codes (tight coupling)
- Schwierigkeiten beim Testen
- Code-Wiederholungen beim Erstellen von Objekten
- Problemen bei Wartung und Erweiterung
PHP-DI löst diese Probleme, indem es automatisch erkennt, welche Klassen Ihr Code benötigt, und diese mit den richtigen Abhängigkeiten erstellt. Die Bibliothek unterstützt:
- Automatische Injektion über den Konstruktor
- Definition von Abhängigkeiten über Annotationen (phpDoc)
- Konfiguration über Arrays, YAML oder PHP-Dateien
- Lazy Loading
- Integration mit gängigen Frameworks
Installation von PHP-DI
PHP-DI wird über Composer installiert – den Standard-Paketmanager für PHP:
composer require php-di/php-di
Wenn Sie das Slim-Framework verwenden, installieren Sie das Integrationspaket:
composer require php-di/slim-bridge
Für Symfony gibt es ein separates Paket:
composer require php-di/symfony-bridge
Nach der Installation binden Sie den Composer-Autoloader in Ihr Projekt ein:
require __DIR__ . '/vendor/autoload.php';
Schnellstart mit einem Codebeispiel
Betrachten wir ein einfaches Beispiel zur Nutzung von PHP-DI. Angenommen, wir haben eine Klasse Mailer, die von der Klasse Logger abhängt:
<?php
// Logger-Klasse
class Logger {
public function log($message) {
echo "[LOG]: " . $message . "\n";
}
}
// Mailer-Klasse, die von Logger abhängt
class Mailer {
private $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
public function send($to, $subject) {
$this->logger->log("Sende E-Mail an {$to}: {$subject}");
// Versandlogik...
}
}
// DI-Container erstellen
$container = new DI\Container();
// Mailer-Objekt abrufen – alle Abhängigkeiten werden automatisch aufgelöst
$mailer = $container->get('Mailer');
$mailer->send('user@example.com', 'Hallo!');
?>
In diesem Beispiel erstellt PHP-DI automatisch eine Instanz von Logger und übergibt sie an den Konstruktor von Mailer. Sie müssen nicht new Logger() schreiben – der Container erledigt das für Sie.
Wichtige Methoden und Funktionen von PHP-DI
1. Container::get() – Objekt aus dem Container abrufen
Funktion: Ruft ein Objekt anhand seines Namens (Klasse, Interface oder Alias) aus dem Container ab. Wenn das Objekt noch nicht erstellt wurde, erstellt der Container es samt aller Abhängigkeiten.
Parameter:
string $name– Name der Klasse, des Interfaces oder Alias
Beispiel:
$container = new DI\Container();
$logger = $container->get('Logger'); // Erstellt und gibt ein Logger-Objekt zurück
$mailer = $container->get('Mailer'); // Erstellt Mailer mit integriertem Logger
2. Container::set() – Definition registrieren
Funktion: Registriert eine Definition für eine Klasse, ein Interface oder einen Alias. Ermöglicht die Angabe, wie das Objekt genau erstellt werden soll.
Parameter:
string $name– Name der Klasse oder Aliasmixed $definition– Definition (String, Array, Closure, Definition-Objekt)
Beispiel:
Auch in der Bibliothek
Arbeiten mit CSV in Go (Golang): Vollständige Anleitung zum Parsen und Schreiben
Ardalis.Specification für C# (.NET): Vollständige Anleitung mit Beispielen
PDF-Generierung in TypeScript: Überblick über Bibliotheken und Tools
GraphQL-Bibliothek für C++: API-Implementierung mit graphql-cpp
Rate Limiting in Kotlin: Bibliotheken und Implementierung