Я работаю над проектом Symfony3 и играю с «новым» механизмом внедрения зависимостей.
Может ли кто-нибудь, пожалуйста, объясните мне следующее поведение:
это моя установка:
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();
}
}
Я пытаюсь получить услугу A
внутри indexAction
из контейнера. Как я отметил это личное в моем services.yml
Я ожидаю исключение при попытке получить его (как в Scenario B
). Но в Scenario A
Я не получаю исключение, потому что служба A
уже был введен (автоматически подключен) в контроллер.
(здесь (ожидаемое) исключение сценария B: You have requested a non-existent service "MyBundle\A".
)
Могут ли некоторые объяснить это поведение, пожалуйста.
ура
После небольшого объяснения в комментариях я понимаю ваш вопрос как:
Как частный сервис становится общедоступным по запросу в действии контроллера?
С введением действия эти собранные услуги повторно регистрируются в ServiceLocator
класс, который делает его доступным с ->get()
,
Увидеть RegisterControllerArgumentLocatorsPass
Вот.
Я согласен, что это немного неясное поведение. Не все пути могут быть покрыты, я думаю.
Неверное поведение частных сервисов описано здесь:
http://symfony.com/blog/new-in-symfony-3-2-improved-private-services
Запрос частного сервиса с помощью метода Container :: get () устарел в Symfony 3.2 и больше не возвращает сервис в 4.0.
Есть ли в журнале разработчиков какой-либо «устаревший» журнал?