Service scopes control how long an instance of a service is used by the container. The DependencyInjection component provides three scopes:
- container(the default one) where the same instance is used each time you ask for a service from the container;
- prototypewhere a new instance is created each time you ask for the service;
- requestwhere a new instance is created for each subrequest (and it's unavailable outside the request).
The request_stack service, introduced in Symfony 2.4, solved the problems
related to the request scope and dealing with the Request object in
services. This made us rethink the entire "scope" concept and we decided to
simplify the DependencyInjection component deprecating them entirely in Symfony
2.8 and removing them in Symfony 3.0.
The new shared option
Instead of scope, service definitions can now configure a shared option.
By default this option is true, which is equivalent to the previous
container scope. Set it to false to get the same result as in the
previous prototype scope:
1 2 3 4 5 6 7 8 9 10 11 12
# 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: falseThis deprecation may seem small, but it will produce significant benefits, such
as easing the learning curve of Symfony and eliminating hard to understand
exceptions (e.g. ScopeWideningInjectionException).
 
                
I like that, the scope configuration was weird. Shared would exactly do what a developer expect from a service.