.. index:: single: Dependency Injection; Advanced configuration Advanced Container Configuration ================================ Marking Services as public / private ------------------------------------ When defining services, you'll usually want to be able to access these definitions within your application code. These services are called ``public``. For example, the ``doctrine`` service registered with the container when using the DoctrineBundle is a public service as you can access it via:: $doctrine = $container->get('doctrine'); However, there are use-cases when you don't want a service to be public. This is common when a service is only defined because it could be used as an argument for another service. .. note:: If you use a private service as an argument to only one other service, this will result in an inlined instantiation (e.g. ``new PrivateFooBar()``) inside this other service, making it publicly unavailable at runtime. Simply said: A service will be private when you do not want to access it directly from your code. Here is an example: .. configuration-block:: .. code-block:: yaml services: foo: class: Example\Foo public: false .. code-block:: xml .. code-block:: php $definition = new Definition('Example\Foo'); $definition->setPublic(false); $container->setDefinition('foo', $definition); Now that the service is private, you *cannot* call:: $container->get('foo'); However, if a service has been marked as private, you can still alias it (see below) to access this service (via the alias). .. note:: Services are by default public. Aliasing -------- You may sometimes want to use shortcuts to access some services. You can do so by aliasing them and, furthermore, you can even alias non-public services. .. configuration-block:: .. code-block:: yaml services: foo: class: Example\Foo bar: alias: foo .. code-block:: xml .. code-block:: php $definition = new Definition('Example\Foo'); $container->setDefinition('foo', $definition); $containerBuilder->setAlias('bar', 'foo'); This means that when using the container directly, you can access the ``foo`` service by asking for the ``bar`` service like this:: $container->get('bar'); // Would return the foo service Requiring files --------------- There might be use cases when you need to include another file just before the service itself gets loaded. To do so, you can use the ``file`` directive. .. configuration-block:: .. code-block:: yaml services: foo: class: Example\Foo\Bar file: "%kernel.root_dir%/src/path/to/file/foo.php" .. code-block:: xml %kernel.root_dir%/src/path/to/file/foo.php .. code-block:: php $definition = new Definition('Example\Foo\Bar'); $definition->setFile('%kernel.root_dir%/src/path/to/file/foo.php'); $container->setDefinition('foo', $definition); Notice that Symfony will internally call the PHP function require_once which means that your file will be included only once per request.