Service scopes контролирует, как долго экземпляр службы используется контейнером. Компонент Dependency Injection обеспечивает три диапазона:
container
, один и тот же экземпляр используется каждый раз, когда вы запрашиваете сервисы из контейнера (по умолчанию один);prototype
, создается новый экземпляр каждый раз, когда вы запрашиваете сервис;-
request
, создается новый экземпляр для каждого подзапроса (не доступны за пределами запроса).
Сервис request_stack
, введенный в Symfony 2.4, решил проблемы, связанные с request
scope и имеющие дело с объектом Request
в службах. Это заставило нас пересмотреть всю «scope» концепцию , и мы решили упростить DependencyInjection компонент объявить устаревшим в Symfony 2.8 и удалить его в Symfony 3.0.
Новая опция shared
Вместо scope, определения услуг теперь могут настроить с помощью параметра shared
. По умолчанию эта опция true
, что эквивалентно предыдущему container
scope. Установите его в false
, чтобы получить тот же результат, как и в предыдущем prototype
scope:
# app/config/services.yml # BEFORE services: app.my_service: class: AppBundle\Service\MyService scope: prototype # AFTER services: app.my_service: class: AppBundle\Service\MyService shared: false
Это нововведение может показаться небольшим, но произволяет получить значительные преимущества, такие как ослабление кривой обучения Symfony и устранения трудно понимаемых исключений (например ScopeWideningInjectionException
).
Источник: http://symfony.com/blog/new-in-symfony-2-8-deprecating-scopes-and-introducing-shared-services