【问题标题】:JMSDiExtraBundle @Inject does not work in custom classes, but works in the controllerJMSDiExtraBundle @Inject 在自定义类中不起作用,但在控制器中起作用
【发布时间】:2025-12-18 18:21:12
【问题描述】:

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

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 不适用于我自己的课程?

【问题讨论】:

  • 能否请您验证我回答中的要点?您尝试注入的属性是公共的……这很好……但是……您的捆绑包(如果包含自定义类)在已配置捆绑包的列表中吗? ...否则...您的非控制器类是否在配置为jms_di_extra.locations.directories的目录之一中?
  • 我已经检查了你的答案,并且我已经尝试添加 @Service 注释 - 不起作用。属性始终为public - 仍然不起作用。我也尝试将jms_di_extra.locations.directories 设置为"%kernel.root_dir%/../src" - 但仍然无法正常工作
  • 您尝试将@Inject 与 (path/namespace) 一起使用的类位于何处?您是否可能在 xml / yml 配置文件中另外提供了额外的服务定义?
  • 您在说什么附加服务?与运行此类的 Controller 位于同一命名空间内的 TestDI 类。 (Acme\DemoBundle\Controller)
  • 我说的是没有配置注入的重复服务定义。即您添加了@service,但已经将类定义为服务,例如Bundle\Resources\config\services.xml

标签: php symfony dependency-injection


【解决方案1】:

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

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

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

进一步记住:

请注意,您不能在 private 上使用 @Inject 注解,或者 受保护的财产。

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

更多信息在官方文档 - chapter non-controller classes.

【讨论】:

  • 我应该将我的服务类放在哪个目录中?例如:/src/MyNS/SecurityExtensionBundle/services/MyService.php - 有效吗?