Новое в Symfony 3.2: Улучшенные приватные сервисы

Приватные сервисы поддерживались контейнером сервисов 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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

четыре × 3 =