nimbly / resolve

一个简单的 PSR-11 兼容的自动注入和依赖注入器。

2.3 2024-05-04 17:23 UTC

This package is auto-updated.

Last update: 2024-09-04 18:11:46 UTC


README

Latest Stable Version GitHub Workflow Status Codecov branch License

Resolve

Resolve 是一个自动注入和依赖解析特质,能够调用函数或方法或创建类的实例(可选带有 PSR-11 兼容的容器)。

在你的项目或库中使用 Resolve,当你想要利用与特定 ContainerInterface 实现解耦的依赖注入时。

安装

composer require nimbly/resolve

要求

  • PHP >= 8.0

容器支持

Resolve 可以选择性地传递一个 PSR-11 容器实例,但并不附带实现。

你可以尝试以下之一

用法

Resolve 特质添加到任何需要添加依赖注入功能的对象中。

class Dispatcher
{
    use Resolve;

    public function __construct(
        protected Router $router,
        protected ContainterInterface $container)
    {
    }

    public function dispatch(ServerRequestInterface $request): ResponseInterface
    {
        $route = $this->router->resolve($request);

        $handler = $this->makeCallable($route->getHandler());

        return $this->call(
            $handler,
            $this->container,
            [ServerRequestInterface::class => $request]
        );
    }
}

创建实例

make 方法可以实例化任何需要的类,并自动从容器实例(如果提供)和提供的可选参数中解析构造函数依赖项。

$instance = $this->make(
    FooHandler::class,
    $this->container,
    ["additional_parameter" => "Foo"]
);

使可调用对象可调用

通常,你希望将表示可调用对象的某个东西转换成实际的 callable 类型。你可以将表示可调用的字符串或实际的 callable 传递给 makeCallable 方法。

// An invokable class.
$invokable = $this->makeCallable(Foo::class, $this->container);

你可以传入一个完全限定的类命名空间、一个 @ 符号和类方法名。例如

// A class and method name string.
$instance_method = $this->makeCallable("\App\Http\Handlers\FooHandler@createNewFoo");

调用

call 方法将调用你传递的任何 callable,从容器和传递的可选参数集中解析那个可调用对象的依赖项,并调用该 callable

如果无法从容器或可选参数中解析依赖项,Resolve 将自动为你尝试 make

如果创建依赖项失败或不可能,将抛出异常。

可调用类型

实例方法

$this->call(
	[new FooHandler, "findById"],
    $this->container,
	[
		ServerRequestInteface::class => $serverRequest,
		"id" => "3122accd-e640-4c4c-b299-ccad074cb077"
	]
);

静态方法

$this->call(
	[FooHandler::class, "findById"],
    $this->container,
	[
		ServerRequestInteface::class => $serverRequest,
		"id" => "3122accd-e640-4c4c-b299-ccad074cb077"
	]
);

可调用对象

$this->call(
	new FooHandler,
    $this->container,
	[
		ServerRequestInteface::class => $serverRequest,
		"id" => "3122accd-e640-4c4c-b299-ccad074cb077"
	]
);

函数

$this->call(
	"\Handlers\Foo\findById",
    $this->container,
	[
		ServerRequestInteface::class => $serverRequest,
		"id" => "3122accd-e640-4c4c-b299-ccad074cb077"
	]
);