Back to Documentation
API Reference

⚙️Container API Reference

The Container is Siro's Dependency Injection container with autowiring, singleton resolution, contextual bindings, and circular dependency detection.

Overview#

The Container is Siro's Dependency Injection container with autowiring, singleton resolution, contextual bindings, and circular dependency detection.

php
use Siro\Core\Container;

$container = Container::getInstance();

Basic Usage#

Resolve from Container#

php
$service = $container->make(UserService::class);

// With parameters
$controller = $container->make(ProductController::class);

Singleton Access#

php
$container = Container::getInstance();

All resolutions are singletons by default within a single request lifecycle.

Binding#

Bind Interface to Implementation#

php
$container->bind(UserRepositoryInterface::class, UserRepository::class);

// Resolve returns UserRepository instance
$repo = $container->make(UserRepositoryInterface::class);

Bind Singleton#

php
$container->singleton(CacheService::class, function ($c) {
    return new CacheService(config('cache.ttl'));
});

Bind Instance#

php
$container->instance('db', Database::connection());

Contextual Binding#

Bind different implementations based on which class consumes them:

php
$container->when(OrderController::class)
    ->needs(OrderProcessorInterface::class)
    ->give(ExpressOrderProcessor::class);

$container->when(BackofficeController::class)
    ->needs(OrderProcessorInterface::class)
    ->give(BatchOrderProcessor::class);

Autowiring#

The container automatically resolves constructor parameters:

php
class ProductController
{
    // Automatically resolved from container
    public function __construct(
        private readonly ProductService $service,
        private readonly Logger $logger,
    ) {}
}

Primitive Values#

For scalar parameters, use contextual binding:

php
$container->when(ProductController::class)
    ->needs('$perPage')
    ->give(20);

Tags#

Tag related services for batch retrieval:

php
$container->tag([
    ReportGenerator::class,
    PdfExporter::class,
    CsvExporter::class,
], 'exports');

// Retrieve all tagged services
$exporters = $container->tagged('exports');

Rebound Callbacks#

Execute code when a binding is resolved or rebound:

php
$container->rebinding('cache', function ($c, $instance) {
    // Called when 'cache' binding is overwritten
    $c->make(Logger::class)->debug('Cache driver changed');
});

Circular Dependency Detection#

php
class A { public function __construct(B $b) {} }
class B { public function __construct(A $a) {} }

$container->make(A::class);
// Throws RuntimeException: Circular dependency detected: A → B → A

Available Methods#

MethodDescription
getInstance()Get singleton container instance
make(string $class)Resolve a class from container
instance(string $abstract, mixed $instance)Set concrete instance
when(string $class)Start contextual binding
needs(string $parameter)Specify parameter for contextual binding
give(mixed $implementation)Specify implementation for contextual binding
tag(array $classes, string $tag)Tag services
tagged(string $tag)Get all tagged services
rebinding(string $abstract, Closure $callback)Register rebound callback
has(string $abstract)Check if binding exists
forgetInstance(string $abstract)Remove resolved instance
clearResolved()Clear all resolved instances