JMSDiExtraBundle @Inject在自定义类中不起作用,但在控制器中起作用

时间:2013-08-30 13:16:14

标签: php symfony dependency-injection

我想要注入会话服务的测试类:

namespace Acme\DemoBundle\Controller;

use JMS\DiExtraBundle\Annotation as DI;

class TestDI
{

    /** @DI\Inject("session") */
    public $session;

}

输出测试类类型的控制器操作:

... Controller {

/** @DI\Inject("session") */
private $session;

public function testAction()
{
    $test = new TestDI();
    echo gettype($this->session).'<br/>';
    echo gettype($test->session);
    return array();
}

给了我:

object
NULL

结果。为什么@Inject不适用于我自己的班级?

1 个答案:

答案 0 :(得分:1)

您必须将非控制器类注册为服务才能使DIExtra注释生效。实现此目的的最简单方法是添加类级@Service注释(JMS\DiExtraBundle\Annotation\Service)。

您必须确保您的非控制器类位于JMSDiExtraBundle实际找到的目录中。您可以在捆绑包的配置中配置正在搜索的捆绑包和目录:

jms_di_extra:
    locations:
        all_bundles: false
        bundles: [FooBundle, AcmeBlogBundle]
        directories: ["%kernel.root_dir%/../src"]

进一步牢记:

  

请注意,您不能在私有或@上使用@Inject注释   受保护的财产

     

同样,@ InjectParams注释不适用于受保护或私有方法。

官方文档中的更多信息 - chapter non-controller classes