DI Container
8/8/25Less than 1 minute
Description:
- Quản lí và thực hiện binding, resolving các dependency.
- Tự động inject các dependency được type hinting trong application.
Binding:
abstract class AbstractContainer implements ContainerInterface
{
protected array $instances = [];
public function bind($abstract, $concrete = null): void
{
if ($concrete === null) {
$concrete = $abstract;
}
$this->instances[$abstract] = $concrete;
}
}
Property instances
lưu các dependency được binding trong container.
Resolve:
public function make($abstract, array $parameters = [])
{
return $this->resolve($this->instances[$abstract], $parameters);
}
Get dependency đã được bind trong container.
Tự động Inject các dependency:
public function resolve($concrete, array $parameters)
{
if ($concrete instanceof Closure) {
return $concrete($this, $parameters);
}
$reflector = new ReflectionClass($concrete);
// check if class is instantiable
if (!$reflector->isInstantiable()) {
throw new Exception("Class {$concrete} is not instantiable");
}
// get class constructor
$constructor = $reflector->getConstructor();
if (is_null($constructor)) {
// get new instance from class
return $reflector->newInstance();
}
// get constructor params
$parameters = $constructor->getParameters();
$dependencies = $this->getDependencies($parameters);
// get new instance with dependencies resolved
return $reflector->newInstanceArgs($dependencies);
}
Sử dụng Reflection Class để phân tích class và tự động inject các dependency.
Packagist: https://packagist.org/packages/nin/nin