Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Re-reading private service section #4748

Merged
merged 2 commits into from
Jan 4, 2015
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 17 additions & 19 deletions components/dependency_injection/advanced.rst
Original file line number Diff line number Diff line change
Expand Up @@ -10,29 +10,19 @@ 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::
is a public service. This means that you can fetch it from the container
using the ``get()`` method::

$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.
In some cases, a service *only* exists to be injected into another service
and is *not* intended to be fetched directly from the container as shown
above.

.. _inlined-private-services:

Since a container is not able to detect if a service is retrieved from inside
the container or the outside, a private service may still be retrieved using
the ``get()`` method.

What makes private services special, is that they are converted from services
to inlined instantiation (e.g. ``new PrivateThing()``) when they are only
injected once, to increase the container performance. This means that you can
never be sure if a private service exists in the container.

Simply said: A service will be private when you do not want to access it
directly from your code.

Here is an example:
In these cases, to get a minor performance boost, you can set the service
to be *not* public (i.e. private):

.. configuration-block::

Expand Down Expand Up @@ -63,11 +53,19 @@ Here is an example:
$definition->setPublic(false);
$container->setDefinition('foo', $definition);

Now that the service is private, you *should not* call (should not means, this
*might* fail, see the explaination above)::
What makes private services special is that they are converted from services
to inlined instantiations (e.g. ``new PrivateThing()``) if they are only
injected once. This increases the container's performance.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

well I know it isn't very great english (well, at least it isn't very good dutch), I like "What makes private services special is that, if they are only injected once, they are converted from services to inlined instantiations (e.g. new PrivateThing())." more

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does sound better to me - good suggestion :)


Now that the service is private, you *should not* fetch the service directly
from the container::

$container->get('foo');

This *may or may not work*, depending on if the service could be inlined.
Simply said: A service can be marked as private if you do not want to access
it directly from your code.

However, if a service has been marked as private, you can still alias it (see
below) to access this service (via the alias).

Expand Down