Php symfony v3.3.6意外服务行为
我正在做一个Symfony3项目,并在玩“新的”依赖注入机制。 请给我解释一下以下行为好吗 这是我的设置:Php symfony v3.3.6意外服务行为,php,dependency-injection,autowired,symfony-3.3,Php,Dependency Injection,Autowired,Symfony 3.3,我正在做一个Symfony3项目,并在玩“新的”依赖注入机制。 请给我解释一下以下行为好吗 这是我的设置: 服务.yml 控制器方案A 这里描述了私有服务的无效行为: Symfony 3.2中不推荐使用Container::get()方法请求私有服务,并且在4.0中不再返回该服务 它是否在开发者日志中记录了任何“不推荐”的内容?在评论中稍作解释后,我理解您的问题为: 私人服务如何通过控制器操作中的请求变为公共服务? 通过action injection,收集到的这些服务将通过ServiceL
服务.yml 控制器方案A
这里描述了私有服务的无效行为:
Symfony 3.2中不推荐使用Container::get()方法请求私有服务,并且在4.0中不再返回该服务
它是否在开发者日志中记录了任何“不推荐”的内容?在评论中稍作解释后,我理解您的问题为:
私人服务如何通过控制器操作中的请求变为公共服务?
通过action injection,收集到的这些服务将通过ServiceLocator
类重新注册,从而可以通过->get()
访问这些服务
看这里
我同意这有点不清楚。并非所有路径都可以覆盖,我想。这并不能回答问题,但你的答案是:我想,通过action injection,收集到的这些服务将通过“ServiceLocator”类重新注册,这使得它可以通过->get()访问:请参见此处:如果此WTF仍保留在Symfony 3.4中,您可以将其报告为一个问题:我认为Symfony团队可能不想修复此问题。重新注册确实解释了场景A。它在服务的可见性/可访问性方面产生了一种非常奇怪的行为。谢谢您的努力
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();
}
}