Container
Raxos\Container\Container
The default dependency injection container. It implements Raxos\Contract\Container\ContainerInterface and autowires classes, functions and methods through reflection.
class Container implements ContainerInterfaceConstructor
public function __construct(
public readonly bool $production = false,
array $definitions = [],
array $singletons = [],
)Creates a container. In production mode, dependency chains are not tracked, which speeds up resolution at the cost of less detailed exceptions. $definitions and $singletons seed the container with initial bindings. The new container always resolves itself for ContainerInterface::class, Container::class and its concrete class.
Binding methods
bind
public function bind(string $abstract, callable|string|null $concrete): voidRegisters a class string or factory closure for an abstract identifier. The binding is rebuilt on every resolution.
bindIf
public function bindIf(string $abstract, callable|string|null $concrete): voidRegisters a binding only if one does not already exist.
singleton
public function singleton(string $abstract, callable|string|null $concrete, UnitEnum|string|null $tag = null): voidRegisters a singleton binding, optionally scoped by a tag. The concrete value is built once and reused for every later resolution.
singletonIf
public function singletonIf(string $abstract, callable|string|null $concrete, UnitEnum|string|null $tag = null): voidRegisters a singleton binding only if one does not already exist.
instance
public function instance(string $abstract, object $instance, UnitEnum|string|null $tag = null): voidRegisters an already constructed instance as a singleton, optionally scoped by a tag.
unbind
public function unbind(string $abstract, bool $tagged = false): voidRemoves the definition and singleton for an abstract. When $tagged is true, every tagged variant of the abstract is removed as well.
Lookup methods
get
public function get(string $abstract, UnitEnum|string|null $tag = null): objectResolves and returns an instance for the abstract, autowiring it if no binding exists. Optionally scoped by a tag.
has
public function has(string $abstract, UnitEnum|string|null $tag = null): boolChecks whether a definition or singleton exists for the abstract and tag.
tagged
public function tagged(UnitEnum|string $tag): iterableYields all resolved singletons sharing the given tag, keyed by their abstract.
Invocation
call
public function call(Closure|array|string $callable, array $args = []): mixedInvokes a closure, an [target, method] pair, or an invokable class string, autowiring every parameter not present in $args. Named arguments in $args override autowired values.
Example
<?php
declare(strict_types=1);
use Raxos\Container\Container;
$container = new Container();
$container->singleton(Database::class, static fn(Container $container): Database =>
new Database($container->get(Config::class)));
$container->instance(DatabaseConnection::class, $readReplica, tag: 'read');
$database = $container->get(Database::class);
$reader = $container->get(DatabaseConnection::class, tag: 'read');
$count = $container->call([$reportController, 'index'], [
'page' => 1,
]);