1

在我的应用程序中,我生成n了许多类。它们都具有相同的骨架并具有相似的目的。它们还共享依赖项。

而不是像这样添加n条目:services.xml

    <service id="acme.security.first_voter" class="Acme\SecurityBundle\Security\Authorization\Voter\FirstVoter" public="false">
        <tag name="security.voter" />
        <argument type="service" id="logger" />
    </service>
    <service id="acme.security.second_voter" class="Acme\SecurityBundle\Security\Authorization\Voter\SecondVoter" public="false">
        <tag name="security.voter" />
        <argument type="service" id="logger" />
    </service>

我想简单地添加一个这样的条目:

    <service id="acme.security.base_voter" class="Acme\SecurityBundle\Security\Authorization\Voter\BaseVoter" public="false">
        <tag name="security.voter" />
        <argument type="service" id="logger" />
    </service>

并在每个选民中简单地添加

use Acme\SecurityBundle\Security\Authorization\Voter\BaseVoter;

class FirstVoter extends BaseVoter

但这不起作用。

我见过使用 Parent Services 管理公共依赖项,但它不能解决我的问题,因为它需要我添加一个

<service id="acme.security.first_voter" class="Acme\SecurityBundle\Security\Authorization\Voter\FirstVoter" parent="base_voter"/>
<service id="acme.security.second_voter" class="Acme\SecurityBundle\Security\Authorization\Voter\SecondVoter" parent="base_voter"/>

对于每个选民......但这正是我想要避免的,因为n可以是 5 或.. 500。

我已经阅读了一些关于将依赖项注入接口的旧 Richard Miller 博客文章,并且所有实现该接口的类都将“继承注入的依赖项”(也被注入该服务)。这正是我需要的!不幸的是,由于某种原因,它已被删除,并且不适用于 Symfony2.3。

我的问题有什么解决办法吗?

4

1 回答 1

2

为此,您可以很好地使用父服务。

您只需使用CompilerPass将它们全部注册,而不是手动添加每个。

使用 Finder 组件在所有捆绑包的 ie Voter 文件夹中搜索扩展基本选民的类 - 然后在 CompilerPass 中注册它们。

出于性能原因,通过缓存结果来改进:)


或者你使用JMSDiExtraBundle

use JMS\DiExtraBundle\Annotation\Service;

/**
 * @Service("some.service.id", parent="another.service.id", public=false)
 */
class Voter extends BaseVoter
{
}

它基本上就是这样做的(使用编译器通行证)。

于 2013-06-14T09:24:20.627 回答