Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php symfony v3.3.6意外服务行为_Php_Dependency Injection_Autowired_Symfony 3.3 - Fatal编程技术网

Php symfony v3.3.6意外服务行为

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

我正在做一个Symfony3项目,并在玩“新的”依赖注入机制。 请给我解释一下以下行为好吗

这是我的设置:


服务.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(); 
    }
}