我正在研究Symfony3项目并使用“新”依赖注入机制。 可以请一些人向我解释以下行为:
这是我的设置:
services:
_defaults:
autowire: true
autoconfigure: true
public: false
MyBundle\Controller\:
resource: '../../Controller/'
public: true
tags: ['controller.service_arguments']
MyBundle\A:
public:false
<?php
namespace MyBundle\Controller;
use ...
class RootController extends Controller
{
/**
* @Route("/", name="root")
*/
public function indexAction(A $a) <- INJECTION HERE
{
$b = $this->get(A::class); // NO EXCEPTION THROWN HERE
return new Response();
}
}
<?php
namespace MyBundle\Controller;
use ...
class RootController extends Controller
{
/**
* @Route("/", name="root")
*/
public function indexAction() // <- NO INJECTION
{
$b = $this->get(A::class); // EXCEPTION THROWN HERE
return new Response();
}
}
我尝试从容器中获取A
内的服务indexAction
。当我在services.yml
中将其标记为私有时,我在尝试抓取它时会遇到异常(例如在Scenario B
中)。但是在Scenario A
我没有得到异常,因为服务A
已经被注入(自动连线)到Controller中。
(这里是(预期的)场景B的例外:You have requested a non-existent service "MyBundle\A".
)
请一些人解释一下这种行为。
欢呼声
答案 0 :(得分:1)
在评论中解释一下后,我理解你的问题:
私人服务如何在控制器操作中按要求公开?
通过操作注入,收集的这些服务会重新注册ServiceLocator
类,以便->get()
可以访问。
请在此处查看RegisterControllerArgumentLocatorsPass
。
我同意这种行为有点不清楚。我猜不是所有路径都可以覆盖。
答案 1 :(得分:0)
此处描述了私有服务的无效行为: http://symfony.com/blog/new-in-symfony-3-2-improved-private-services
在Symfony 3.2中不推荐使用Container :: get()方法请求私有服务,并且不再在4.0中返回该服务。
它是否在开发人员日志中记录任何“已弃用”?