Symfony2 / JmsDIExtraBundle使用注释将存储库注入服务

时间:2015-02-16 10:16:03

标签: symfony dependency-injection annotations

在我的项目中,我正在使用JMSDIExtraBundle的注释。 我的问题是:如何告诉我的应用程序存储库应该是服务的,我可以使用注释将其注入另一个服务中。 我所知道的唯一方法是使用XML文件将存储库定义为服务。但这是一个非常缓慢的过程(将它与简单的@DI \ Service相比,我更喜欢在yml或xml文件中定义它。) / p>

我找到了另一种XML解决方案,但我认为这是个坏主意:

   ####CustomService.php####
   /**
     * @param EntityManager $em
     *
     * @DI\InjectParams({
     *     "em" = @DI\Inject("doctrine.orm.entity_manager")
     * })
     */
    public function __construct(EntityManager $em) {
        $this->em = $em;
    }

在服务的某个地方:

$entityRepository = $this->em->getRepository(AcmeBundle:Entity);

当我需要使用存储库时,如何加快编码过程的任何想法?

1 个答案:

答案 0 :(得分:3)

您可以将实体存储库定义为服务并将其注入服务。

例如,您可以将repo配置为如下服务:

在标准的Symfony服务定义中:

   ####service.xml####
    <service id="acme.user.repository"
             class="Doctrine\ORM\EntityRepository"
             factory-service="doctrine.orm.entity_manager"
             factory-method="getRepository">
        <argument>AcmeDemoBundle:User</argument>
    </service>

或使用JMSDiExtraBundle中定义的factory to Service annotation(请参阅this):

/**
 * @Service("acme.user.repository", factoryService = "doctrine", factoryMethod="getRepository", factoryMethodArguments={
 * "persistentObjectName" = "Acme\DemoBundle\Entity\User"
 * } )
*/

并注入并将其用作:

   ####CustomService.php####
   /**
     * @param Doctrine\ORM\EntityRepository $repo
     *
     * @DI\InjectParams({
     *     "repo" = @DI\Inject("acme.user.repository")
     * })
     */
    public function __construct(EntityRepository $repo) {
        $this->repo = $repo;
    }

速度不是很快,但只允许注入你需要的东西

希望这个帮助