A lightweight PHP Dependency Injection Container implementing the PSR-11 standard. This library is designed for simplicity and ease of use, making it an ideal choice for small projects where you need a quick and effective DI solution.
|
|
1 dienu atpakaļ | |
|---|---|---|
| src | 1 dienu atpakaļ | |
| tests | 1 dienu atpakaļ | |
| .gitignore | 1 dienu atpakaļ | |
| LICENSE | 1 dienu atpakaļ | |
| README.md | 1 dienu atpakaļ | |
| composer.json | 1 dienu atpakaļ |
A lightweight PHP Dependency Injection Container implementing the PSR-11 standard. This library is designed for simplicity, performance, and ease of use.
#{variable} syntax in strings.composer require michel/psr11-di
The ContainerBuilder is the recommended way to create your container.
use Michel\DependencyInjection\ContainerBuilder;
$builder = new ContainerBuilder();
// Add definitions
$builder->addDefinitions([
'database.host' => 'localhost',
'database.name' => 'app_db',
PDO::class => function ($c) {
return new PDO(
"mysql:host={$c->get('database.host')};dbname={$c->get('database.name')}",
"root",
""
);
}
]);
$container = $builder->build();
$pdo = $container->get(PDO::class);
You don't need to define every class manually. If a class exists, the container will try to instantiate it and inject its dependencies automatically.
class Mailer {
// ...
}
class UserManager {
public function __construct(Mailer $mailer) {
$this->mailer = $mailer;
}
}
// No definitions needed!
$container = (new ContainerBuilder())->build();
$userManager = $container->get(UserManager::class);
In production, using Reflection for every request is slow. You can enable compilation to generate a PHP file containing all your definitions and resolved dependencies.
How it works:
Subsequent requests load this file directly, bypassing Reflection entirely.
$builder = new ContainerBuilder();
$builder->addDefinitions([/* ... */]);
// Enable compilation
// Ideally, do this only in production or when the cache file doesn't exist
$builder->enableCompilation(__DIR__ . '/var/cache/container.php');
$container = $builder->build();
Note: The compiler recursively discovers and compiles all dependencies for "total" resolution caching.
You can use placeholders in your string definitions.
$builder->addDefinitions([
'app.path' => '/var/www/html',
'app.log_file' => '#{app.path}/var/log/app.log',
]);
Un conteneur d'injection de dépendances PHP léger implémentant le standard PSR-11. Cette bibliothèque est conçue pour la simplicité, la performance et la facilité d'utilisation.
#{variable} dans les chaînes.composer require michel/psr11-di
Le ContainerBuilder est la méthode recommandée pour créer votre conteneur.
use Michel\DependencyInjection\ContainerBuilder;
$builder = new ContainerBuilder();
// Ajouter des définitions
$builder->addDefinitions([
'database.host' => 'localhost',
'database.name' => 'app_db',
PDO::class => function ($c) {
return new PDO(
"mysql:host={$c->get('database.host')};dbname={$c->get('database.name')}",
"root",
""
);
}
]);
$container = $builder->build();
$pdo = $container->get(PDO::class);
Vous n'avez pas besoin de définir chaque classe manuellement. Si une classe existe, le conteneur essaiera de l'instancier et d'injecter ses dépendances automatiquement.
class Mailer {
// ...
}
class UserManager {
public function __construct(Mailer $mailer) {
$this->mailer = $mailer;
}
}
// Aucune définition nécessaire !
$container = (new ContainerBuilder())->build();
$userManager = $container->get(UserManager::class);
En production, utiliser la Réflexion à chaque requête est lent. Vous pouvez activer la compilation pour générer un fichier PHP contenant toutes vos définitions et dépendances résolues.
Comment ça marche :
Les requêtes suivantes chargent directement ce fichier, contournant totalement la Réflexion.
$builder = new ContainerBuilder();
$builder->addDefinitions([/* ... */]);
// Activer la compilation
// Idéalement, faites ceci uniquement en production
$builder->enableCompilation(__DIR__ . '/var/cache/container.php');
$container = $builder->build();
Note : Le compilateur découvre et compile récursivement toutes les dépendances pour une mise en cache "totale" de la résolution.
Vous pouvez utiliser des espaces réservés dans vos définitions de chaînes.
$builder->addDefinitions([
'app.path' => '/var/www/html',
'app.log_file' => '#{app.path}/var/log/app.log',
]);
MIT License.