如何在Symfony中注入类而不是服务?

时间:2015-07-22 16:39:17

标签: symfony dependency-injection

我想实现以下目标(不使用services.yml - 理想情况下,如果类型提示不能通过某种注释机制):

class MyClass {
    private $msgService;

    public function __construct(MessageServiceInterface $msgService) {
        $this->msgService = $msgService;
    }

    public function sendMessage($text) {
        $this->msgService->send($text);
    }
}

基本上,我希望Symfony能够告诉MyClass需要注意依赖注入,并且需要注入MessageServiceInterface的实现。

我发现为每个需要使用的类定义服务非常耗时(特别是如果这些类只在该模块中使用,甚至可能只使用一次)。

1 个答案:

答案 0 :(得分:1)

您可以使用JMSDiExtraBundle简化服务定义和使用。该捆绑包为Symfony2提供高级依赖注入功能。特别是Annotation功能,您可以执行以下操作:

将课程标记为服务:

<?php

use JMS\DiExtraBundle\Annotation\Service;

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

这标记了注射方法的参数:

<?php

use JMS\DiExtraBundle\Annotation\Inject;
use JMS\DiExtraBundle\Annotation\InjectParams;
use JMS\DiExtraBundle\Annotation\Service;

/**
 * @Service
 */
class Listener
{
    /**
     * @InjectParams({
     *     "em" = @Inject("doctrine.entity_manager")
     * })
     */
    public function __construct(EntityManager $em, Session $session)
    {
        // ...
    }
}

所有没有任何额外配置文件。

希望这个帮助