Приватные сервисы поддерживались контейнером сервисов Symfony с первого дня. По умолчанию все сервисы являются публичными, но установка опции public в false превращает их в приватные
services: app.manager.user: class: AppBundle\Manager\User public: false
Понятно, что вы можете подумать, что приватные сервисы не доступны из сервис контейнера. Однако, их поведение немного сложнее:
- Если приватный сервис не используется в любой другой сервис, он удаляется из контейнера;
- Если приватный сервис используется только одним сервисом, он будет считается встроенным и его определение удаляется из контейнера;
- Если приватный сервис используется в более чем одним сервисом, то он будет вести себя как публичный сервис, и вы даже можете получать его через $container->get(‘…’).
Это последнее поведение противоречит здравому смыслу, поэтому мы решили улучшить приватные сервисы в Symfony 3.2. С этого момента, приватный сервис всегда ведет себя так, как вы ожидаете:
- Метод включения или отключения приватного сервиса с помощью Container::set() не рекомендуется в Symfony 3.2 и больше не поддерживается в версии 4.0;
- Проверка существования приватного сервиса с Container::has() всегда будет возвращать false в Symfony 4.0;
- Запрос приватного сервиса методом Container::get() не рекомендуется в Symfony 3.2 и больше не возвращает сервис в 4.0.
Следующий шаг, который может быть завершен до Symfony 3.2 релиза, будет рандомизация значений идентификаторов приватных сервисов, что позволит сделает невозможным для приложений получить эти доступ к сервисам в обход ограничений, установленных Symfony.
Источник: https://symfony.com/blog/new-in-symfony-3-2-improved-private-services