Новое в Symfony 5.1: Устаревание публичного сервиса в приватных сервисах

Одной из ключевых функций, которая заставляет разработчиков любить Symfony, является обработка устаревших функций. Обещание обратной совместимости Symfony («обещание BC») гарантирует, что ваше приложение никогда не сломается при обновлении между второстепенными версиями.

В Symfony 5.1 представили новый способ отказаться от общедоступных сервисов и превратить их в частные, сохраняя обещание BC.

На практике эти функции требуют добавления тега в сервис контейнере container.private и нескольких атрибутов тега, которые определяют пакет и версию, в которой он устарел:

services:
    foo:
        # ...
        public: true
        tags:
            - { name: 'container.private', package: 'foo/bar', 'version': '1.2' }

Если ваше приложение пытается получить этот сервис напрямую из контейнера ($container->get('foo')), вы увидите следующую ошибку:

Since foo/bar 1.2: Accessing the "foo" service directly from the container
is deprecated, use dependency injection instead.

Технически эта функция использует проход компилятора для создания устаревшего публичного псевдонима публичной службы. Это делается только тогда, когда код обращается к службе напрямую (не при использовании автопроводки), чтобы избежать отображения ненужных устареваний.

Эта функцию уже используется в ядре Symfony, чтобы превратить некоторые публичные сервисы в частные (например, сервис веток в PR #36739), и вы также можете начать использовать его в своих собственных публичных пакетах и частных приложениях.