Symfony v3.3.6 неожиданное поведение службы

Я работаю над проектом 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 уже был введен (автоматически подключен) в контроллер.

(здесь (ожидаемое) исключение сценария B: You have requested a non-existent service "MyBundle\A".)

Могут ли некоторые объяснить это поведение, пожалуйста.

ура

1

Решение

После небольшого объяснения в комментариях я понимаю ваш вопрос как:

Как частный сервис становится общедоступным по запросу в действии контроллера?

С введением действия эти собранные услуги повторно регистрируются в ServiceLocator класс, который делает его доступным с ->get(),

Увидеть RegisterControllerArgumentLocatorsPass Вот.

введите описание изображения здесь

Я согласен, что это немного неясное поведение. Не все пути могут быть покрыты, я думаю.

1

Другие решения

Неверное поведение частных сервисов описано здесь:
http://symfony.com/blog/new-in-symfony-3-2-improved-private-services

Запрос частного сервиса с помощью метода Container :: get () устарел в Symfony 3.2 и больше не возвращает сервис в 4.0.

Есть ли в журнале разработчиков какой-либо «устаревший» журнал?

0