hco / auto-wiring-bundle
Requires
- doctrine/annotations: ~1.1
- symfony/config: ~2.3
- symfony/dependency-injection: ~2.3
Requires (Dev)
- phpunit/phpunit: ~3.7
This package is not auto-updated.
Last update: 2024-09-23 15:56:19 UTC
README
此捆绑包简化了symfony2 DIC的使用,通过自动注入(构造函数)依赖项。
所有应该自动注入的类必须在DIC中有一个特定的标签。然后,捆绑包将遍历构造函数参数,并尝试找到满足每个参数类型提示的服务。
如果没有恰好一个服务满足类型提示,自动注入将失败。尽管如此,限定符和主服务可能有助于您解决这个问题 :)。
自动注入过程在服务容器的编译时间进行,这意味着它 不应该在生产环境中产生任何性能影响。
稳定性
我已经在这个应用程序中使用这个捆绑包,并且它运行得相当好。然而,我还没有发布1.0版本,因为我期待反馈和经验。
我打算保持每个更改 向后兼容。
限定符
服务可以有一个所谓的“限定符”,这将允许自动注入可以由几个服务满足的类型提示。
例如,可以是你数据库连接。想象一下,你服务容器中有两个数据库连接,一个用于写请求,一个用于只读请求。现在你可以给这两个服务一个限定符,“write”用于写数据库连接,“readonly”用于只读数据库连接。
如果一个服务现在有一个未限定的数据库连接类型提示,自动注入将失败。但是,您现在可以用我们之前使用的字符串限定一个类型提示,这样就会将服务连接到特定的数据库连接。
主服务
服务可以被标记为主服务。当依赖项需要外部注入,并且恰好有一个主服务时,它将被外部注入。对于类,仍然可以有多个非主服务,但它们将被忽略。
如果有两个服务被声明为主服务且类型相同,容器编译将失败。
示例
想象你定义以下类,以下服务配置
class ServiceWithDependency { public $stdObject; public function __construct(StdClass $stdObject) { $this->stdObject = $stdObject; } }
<service id="foo" class="ServiceWithDependency"> <tag name="hco.autowire" /> </service> <service id="bar" class="StdClass"> </service>
这会将服务bar自动注入到服务foo中。
带有限定符的示例
我们将重用上面的ServiceWithDependency类,但修改服务配置。
<service id="foo" class="ServiceWithDependency"> <tag name="hco.autowire" /> </service> <service id="bar" class="StdClass"> </service> <service id="baz" class="StdClass"> </service>
这将失败,因为自动注入捆绑包不知道应该注入哪个服务。这就是限定符发挥作用的地方。我们可以稍微修改类和服务定义。
use HCO\AutoWiringBundle\Annotation\RequireQualifier; class ServiceWithDependency { public $stdObject; /** * @RequireQualifier(param="stdObject", qualifier="readonly") */ public function __construct(StdClass $stdObject) { $this->stdObject = $stdObject; } }
<service id="foo" class="ServiceWithDependency"> <tag name="hco.autowire" /> </service> <service id="bar" class="StdClass"> </service> <service id="baz" class="StdClass"> <tag name="hco.autowire.qualifier" qualifier="readonly" /> </service>
这会将服务baz注入到服务foobar中,因为baz被限定为readonly。
限定符也可以在XML中配置
<service id="foo" class="ServiceWithDependency"> <tag name="hco.autowire"/> <tag name="hco.autowire.require_qualifier" param="stdObject" qualifier="readonly"/> </service> <service id="bar" class="StdClass"> </service> <service id="baz" class="StdClass"> <tag name="hco.autowire.qualifier" qualifier="readonly"/> </service>
类似的东西可以用YAML工作,因为我只是用标签标记服务。
带有主的示例
如果我们标记服务baz为主服务,它将用作ServiceWithDependency的StdClass依赖项。以下services.xml是一个示例。
<services> <service id="foo" class="ServiceWithDependency"> <tag name="hco.autowire" /> </service> <service id="bar" class="\StdClass"> </service> <service id="baz" class="\StdClass"> <tag name="hco.autowire.primary" /> </service> </services>
许可证
此捆绑包受MIT许可证的约束。请参阅此存储库根目录中LICENSE文件中的完整许可证。