finoghentov / container
1.3
2022-03-31 10:08 UTC
Requires
- php: >=7.4
- psr/container: 1.*
Requires (Dev)
- brainmaestro/composer-git-hooks: ^2.8
- phpunit/phpunit: ^9.5.4
- squizlabs/php_codesniffer: *
- symfony/var-dumper: ^5.3.x-dev
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