Php JMSDiExtraBundle@Inject在自定义类中不起作用,但在控制器中起作用
要在其中注入会话服务的测试类:Php JMSDiExtraBundle@Inject在自定义类中不起作用,但在控制器中起作用,php,symfony,dependency-injection,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;
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();
}
结果。为什么@Inject不能与我自己的类一起工作?您必须将非控制器类注册为服务,才能使DIExtra注释工作。实现这一点的最简单方法是添加类级注释(
JMS\diextranble\annotation\Service
)
您必须确保非控制器类位于JMSDiExtraBundle实际找到的目录中。您可以配置捆绑包配置中正在搜索的捆绑包和目录:
jms_di_extra:
locations:
all_bundles: false
bundles: [FooBundle, AcmeBlogBundle]
directories: ["%kernel.root_dir%/../src"]
进一步记住:
请注意,您不能在private或
受保护的财产
同样,@InjectParams注释在受保护或私有方法上也不起作用
官方文件中的更多信息-。您能验证我回答中的要点吗?您尝试注入的属性是公共的。。。那很好。。。但是您的捆绑包(如果包含自定义类)是否在已配置捆绑包的列表中。。。否则。。。您的非控制器类是否在其中一个目录中配置为
jms\u di\u extra.locations.directories
?我已经检查了您的答案,并且我已经尝试添加@Service
注释-不起作用。属性总是公共的
-仍然不起作用。此外,我还尝试将jms\u di\u extra.locations.directories
设置为%kernel.root\u dir%/../src”
,但仍然不起作用。您试图使用@Inject的类位于何处(路径/命名空间)?您是否在xml/yml配置文件中另外提供了一个服务定义?您在谈论什么额外的服务?TestDI类与运行该类的控制器位于同一命名空间中。(Acme\DemoBundle\Controller)我指的是没有配置注入的双副本服务定义。i、 e.您添加了@service,但已经将类定义为服务,例如Bundle\Resources\config\services.xml
我应该将服务类放在哪个目录中?例如:/src/MyNS/SecurityExtensionBundle/services/MyService.php-这是否有效?
jms_di_extra:
locations:
all_bundles: false
bundles: [FooBundle, AcmeBlogBundle]
directories: ["%kernel.root_dir%/../src"]