Container IoC
Le cœur de River est son conteneur d'injection de dépendances (IoC). Il gère automatiquement l'instanciation de vos classes.
Auto-Wiring (Magie)
Dans 90% des cas, vous n'avez rien à configurer. River utilise la Reflection pour analyser les constructeurs de vos classes et injecter les dépendances automatiquement.
class NewsletterService {
public function __construct(
private Mailer $mailer,
private Config $config
) {}
}
// Dans un contrôleur
class UserController extends Controller {
public function __construct(
// River va automatiquement créer Mailer, Config, puis NewsletterService
// et enfin l'injecter ici.
private NewsletterService $newsletter
) { ... }
}
Attributs PHP 8
Vous pouvez contrôler le comportement du container via des attributs.
#[Service]
Marque une classe comme un service géré par le container. Par défaut, c'est un Singleton (une seule instance partagée).
use River\Container\Attributes\Service;
#[Service]
class Database { ... }
Pour créer une nouvelle instance à chaque fois (Transient) :
#[Service(shared: false)]
class Task { ... }
#[Inject]
Pour injecter des valeurs scalaires (configuration) :
use River\Container\Attributes\Inject;
class StripeClient {
public function __construct(
#[Inject('stripe.api_key')] private string $apiKey
) {}
}
Enregistrement Manuel
Pour des cas complexes (interfaces, factories), utilisez un Service Provider :
$container->bind(MailerInterface::class, SmtpMailer::class);
$container->singleton(Client::class, function($c) {
return new Client($c->get('api.key'));
});