rawebone / injector
提供低级别服务注入API的库
1.0.3
2014-07-13 19:51 UTC
Requires (Dev)
- phpspec/phpspec: 2.1.x-dev
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,请参阅附带的文档以获取详细信息。