2.0.2
2016-01-30 11:41 UTC
Requires
- php: >=5.4
Requires (Dev)
- monomelodies/gentry: ^0.5.0
README
PHP5 依赖注入和服务定位器框架。大多数现有的 DI 或控制反转 (IoC) 解决方案都依赖于大量的配置文件来定义依赖。这很糟糕;Disclosu
截至版本 2.0,Disclosure 完全兼容(即将发布的)PSR 容器对象建议。包中包含尚未发布的 PSR\Container 接口副本(直到它们最终发布...)。
安装
Composer(推荐)
composer require monomelodies/disclosure
手动安装
- 获取或克隆代码;
- 在您的 PSR-4 自动加载器中将
/path/to/disclosure/src注册为Disclosure\\命名空间; - 在您的 PSR-4 自动加载器中将
/path/to/disclosure/psr注册为Psr\\Container\\命名空间;
使用方法
将您的依赖项添加到某个位置的 Container 对象中。通常在中心文件(例如 src/dependencies.php)中这样做是有意义的,但与类定义一起执行也完全没问题。
<?php use Disclosre\Container; $container = new Container; $container->register(function (&$foo, &$bar) { $foo = new Foo; $bar = new Bar; });
容器现在会将 foo 键与实例为 Foo 的对象相关联。键的命名无关紧要;只需记住它们必须是唯一的。
使用由 Injector 特性提供的 inject 方法告诉您的类它们应该依赖什么
<?php use Disclosure\Injector; class MyClass { use Injector; public function __construct() { $this->inject(function ($foo, $bar) {}); // Or, alternatively: $this->inject('foo', 'bar'); } } class Foo { } $myInstance = new MyClass; var_dump($myInstance->foo instanceof Foo); // true
inject 接受任意数量的参数,其中每个参数都是一个包含依赖名称的字符串,或一个包含依赖名称作为参数的可调用对象。您使用哪种样式取决于您的个人喜好。
哇! 为什么不直接这样做 $this->foo = new MyDependency;?
有许多理由使用容器而不是到处使用 new 关键字,但主要理由是
- 硬编码实例使在单元测试期间注入模拟变得困难(您可以使用
class_alias来做这件事,但说真的)。 - 它会导致类之间的紧密耦合,这是一个坏主意(tm)。
- 它使将对象作为服务定位器注入(即,一个对象的单个实例而不是每次都创建一个新的实例)变得更容易。
不,在上面的例子中,它并没有添加多少,但请参阅完整的文档,了解依赖注入在现实世界中的实际示例,为什么通常是一个好主意。