symfony v3.3.6意外服务行为

时间:2017-08-08 10:36:38

标签: php dependency-injection autowired symfony-3.3

我正在研究Symfony3项目并使用“新”依赖注入机制。 可以请一些人向我解释以下行为:

这是我的设置:

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

我尝试从容器中获取A内的服务indexAction。当我在services.yml中将其标记为私有时,我在尝试抓取它时会遇到异常(例如在Scenario B中)。但是在Scenario A我没有得到异常,因为服务A已经被注入(自动连线)到Controller中。

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

请一些人解释一下这种行为。

欢呼声

2 个答案:

答案 0 :(得分:1)

在评论中解释一下后,我理解你的问题:

私人服务如何在控制器操作中按要求公开?

通过操作注入,收集的这些服务会重新注册ServiceLocator类,以便->get()可以访问。

请在此处查看RegisterControllerArgumentLocatorsPass

enter image description here

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

答案 1 :(得分:0)

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

  

在Symfony 3.2中不推荐使用Container :: get()方法请求私有服务,并且不再在4.0中返回该服务。

它是否在开发人员日志中记录任何“已弃用”?