symfony v3.3.6 意外的服务行为

symfony v3.3.6 unexpected service behaviour

我正在开发一个 Symfony3 项目并使用 "new" 依赖注入机制。 请一些人向我解释以下行为:

这是我的设置:


services.yml

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  MyBundle\Controller\:
    resource: '../../Controller/'
    public: true
    tags: ['controller.service_arguments']

  MyBundle\A: 
    public:false

控制器场景 A

<?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(); 
    }
}

控制器场景 B

<?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(); 
    }
}

我正在尝试从容器中获取 indexAction 内的服务 A。当我在 services.yml 中将其标记为私有时,我希望在尝试获取它时出现异常(如 Scenario B 中)。但是在 Scenario A 中我没有得到异常,因为服务 A 已经被注入(自动连接)到控制器中。

(这里是场景 B 的(预期)异常:You have requested a non-existent service "MyBundle\A".

请解释一下这种行为。

干杯

私有服务的无效行为描述如下: http://symfony.com/blog/new-in-symfony-3-2-improved-private-services

Requesting a private service with the Container::get() method is deprecated in Symfony 3.2 and no longer returns the service in 4.0.

它是否在开发者日志中记录任何 'deprecated'?

在评论中进行了一些解释后,我将您的问题理解为:

controller action中请求私服如何变成public?

通过操作注入,这些收集的服务将重新注册到 ServiceLocator class,这使得它可以通过 ->get().

访问

请参阅此处 RegisterControllerArgumentLocatorsPass

我同意这是一个有点不清楚的行为。我猜不是所有的路径都可以覆盖。