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'));
});