finoghentov/container

1.3 2022-03-31 10:08 UTC

This package is not auto-updated.

Last update: 2024-09-26 22:22:37 UTC


README

访问容器

您可以通过静态方法构建容器实例

$container = Container::init();

默认情况下,容器实例是单例的,重建它不会给您新的实例。

要获取创建的容器实例,您可以使用静态 getInstance 方法

$container = Container::getInstance();

如果您确实想创建新的容器实例,请使用

Container::unsetInstance();
$container = Container::init();

基本用法

您可以使用公开的 make 方法解决任何具有依赖关系的实例。此方法将按反向解决所有依赖项以及所有默认参数。

示例

class A {
    public B $b;
    
    public function __construct(B $b, $default = 'default') {
        $this->b = $b;
    }
    
    public function doSomeStuffWithDependency()
    {
        $this->b->doSomething();
    }
}

$container = Container::init();
$instance = $container->make(A::class); // Will resolve A class with B dependency
$instance->doSomeStuffWithDependency();

您也可以使用参数名称来设置您自己的参数而不是默认参数

$instance = $container->make(A::class, [
    'default' => 'Not default parameter'
]); 

绑定和单例

绑定

您可以使用 bind 方法将接口绑定到实际实现

$container->bind(IRequest::class, HttpRequest::class);

之后,每个使用 IRequest 作为依赖项的类将通过DI获取 HttpRequest

$container->make(IRequest::class); // Instance of HttpRequest

您也可以绑定自定义回调函数而不是具体实现

$container->bind(IRequest::class, function(Container $container){
    return $container->make(HttpRequest:class);
});

单例

如果您想创建单例实例,可以将依赖项与第三个 singleton 参数绑定

$container->bind(IRequest::class, HttpRequest::class, true);

// or quicker method

$container->singleton(IRequest::class, HttpRequest::class);

您可以使用 has 方法检查是否存在已解析的单例实例,并使用 get 方法获取它

$container->has(IRequest::class); // false
$container->get(IRequest:class); // null

$container->singleton(IRequest::class, HttpRequest::class);

$container->has(IRequest::class); // true
$container->get(IRequest:class); // HttpRequest instance

别名

您可以为特定实现或抽象创建别名

$container->alias('request', HttpRequest::class);
$container->make('request'); // HttpRequest instance

类方法解决

您可以通过DI容器调用具有所有依赖项的类方法。方法 call 将创建一个类实例并运行您设置的方法,注入所有依赖项。

class Controller {
    public function someAction(HttpRequest $request, $id = 0) {
        // some stuff
    }
}

$container = Container::init();

$result = $container->call([
    Controller::class, 'someAction'
]); // resulf of method completing

您可以根据需要替换参数。例如

$result = $container->call([
    Controller::class, 'someAction'
], [
    'id' => $_GET['id']
]);

您可以通过第3个参数传递实例参数,该实例将通过3个参数调用操作

$result = $container->call([
    Controller::class, 'someAction'
], [], [
    'service' => Service::class
]);

测试

您可以通过以下方式运行phpunit测试

$ vendor/bin/phpunit