rawebone/injector

提供低级别服务注入API的库

1.0.3 2014-07-13 19:51 UTC

This package is not auto-updated.

Last update: 2024-09-28 15:23:45 UTC


README

Injector提供了一个低级别的服务注入系统,部分受AngularJS中的系统启发。这个想法与依赖注入有些相似,但实际上它是注入服务——两者的区别微妙但松散:DI基于类型,基于每个类的定义进行覆盖,而服务基于名称。

例如,在一个DI场景中,这两个日志实例将是相同的(在没有其他配置的情况下)

use Psr\Log\LoggerInterface;

interface Injectable
{
    function __construct(LoggerInterface $logA, LoggerInterface $logB);
}

虽然DI和此类配置在非常大的应用程序中很有用,但对于更小、更简洁的应用程序,实现的成本更高,因为它通常更复杂。因此,在这些较小的应用程序中,SL通常可以带来更多的好处,因为您仍然可以获得实例的懒加载和轻松更改定义的能力。

然而,传统的SL系统有一个缺点,那就是它是基于拉系统的

$container["logA"] = function ($container) { return new MyLogger($container["fileA"]); };
$container["logB"] = function ($container) { return new MyOtherLogger($container["fileB"]); };

$container["logB"]->warning("blah");

因此,您的应用程序除了一些DSL的语法和膨胀之外,也不会那么简洁(据我所知)。

这个库提供了一种低级别机制,可以将服务注入到实例中,以清除一些膨胀,此外还有一些用于处理函数和函数签名的低级别实用工具。

注入方法

use Rawebone\Injector\Injector;

$injector = new Injector();

// By default, the injector will resolve to any callable
// with the name given as a broad brush approach:
function my_service()
{
    return new stdClass();
}

// Injection can be handled automatically by passing through
// a callable to the library

$injector->inject(function ($my_service)
{
    var_dump($my_service); // stdClass
});

// Injection can be handled manually by returning the service by name:

$my_service = $injector->service("my_service");

// Or simply getting arguments for the callable:

$args = $injector->argsFor(function ($my_service) {});
var_dump($args); // array("my_service" => stdClass);

如前所述,“将任何可调用对象解析为服务名称”是一种宽泛的策略,但它并没有给我们我们通常想要的东西。因此,实现者可以通过实现Rawebone\Injector\ResolverInterface来指定他们自己的行为,它接受一个服务名称并返回一个要注入的值。

此外,该库还通过Rawebone\Injector\RegisterResolver提供了一种更常见的解决方案

<?php

$resolver = new Rawebone\Injector\RegisterResolver();
$resolver->register("serviceA", function () { return new MyService(); });
$resolver->register("serviceB", new \stdClass());

$resolver->registerMany(array(
    "serviceC" => new \stdClass(),
    "serviceD" => function () { return new MyService(); }
));

$injector->resolver($resolver);

许可证

MIT,请参阅附带的文档以获取详细信息。