hco/auto-wiring-bundle

安装: 20

依赖项: 0

建议者: 0

安全: 0

星星: 9

关注者: 6

分支: 0

开放问题: 0

类型:symfony-bundle

0.9.3 2013-10-04 18:40 UTC

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文件中的完整许可证。