Skip to content

Commit 801ea33

Browse files
[DI] Add section about getter injection
1 parent fefc2f2 commit 801ea33

File tree

1 file changed

+85
-0
lines changed

1 file changed

+85
-0
lines changed

service_container/injection_types.rst

+85
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,91 @@ The disadvantages of setter injection are:
179179
* You cannot be sure the setter will be called and so you need to add checks
180180
that any required dependencies are injected.
181181

182+
Getter Injection
183+
----------------
184+
185+
.. versionadded:: 3.3
186+
Getter Injection was introduced in Symfony 3.3.
187+
188+
Another possible injection point into a class is by overriding a getter method
189+
to make it return the dependency::
190+
191+
// ...
192+
abstract class NewsletterManager
193+
{
194+
abstract protected function getMailer(): MailerInterface;
195+
196+
protected function getLogger(): LoggerInterface
197+
{
198+
return new NullLogger();
199+
}
200+
201+
// ...
202+
}
203+
204+
.. configuration-block::
205+
206+
.. code-block:: yaml
207+
208+
services:
209+
# ...
210+
211+
app.newsletter_manager:
212+
class: AppBundle\Mail\NewsletterManager
213+
getters:
214+
getMailer: '@mailer'
215+
getLogger: '@logger'
216+
217+
.. code-block:: xml
218+
219+
<?xml version="1.0" encoding="UTF-8" ?>
220+
<container xmlns="http://symfony.com/schema/dic/services"
221+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
222+
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
223+
224+
<services>
225+
<!-- ... -->
226+
227+
<service id="app.newsletter_manager" class="AppBundle\Mail\NewsletterManager">
228+
<getter name="getMailer" type="service" id="mailer" />
229+
<getter name="getLogger" type="service" id="logger" />
230+
</service>
231+
</services>
232+
</container>
233+
234+
.. code-block:: php
235+
236+
use AppBundle\Mail\NewsletterManager;
237+
use Symfony\Component\DependencyInjection\Definition;
238+
use Symfony\Component\DependencyInjection\Reference;
239+
240+
// ...
241+
$container->register('app.newsletter_manager', NewsletterManager::class)
242+
->addOverriddenGetter('getMailer', new Reference('mailer'))
243+
->addOverriddenGetter('getLogger', new Reference('logger'))
244+
;
245+
246+
This time the advantages are:
247+
248+
* The dependency can be created lazily - ie only when it is actually needed.
249+
250+
* It works well with both optional and required dependencies: either provide
251+
a default implementation for optional ones, throw an exception or make the
252+
getter abstract for required ones.
253+
254+
* You can be sure that the dependency will not change during the object's
255+
lifetime.
256+
257+
* It works well with class hierarchies since you can also override getters of
258+
parent classes.
259+
260+
The disadvantage of getter injection is:
261+
262+
* By using inheritance to override methods, it doesn't work with final classes
263+
and requires such getters to be made protected or public.
264+
265+
* It works only on PHP 7 or higher.
266+
182267
Property Injection
183268
------------------
184269

0 commit comments

Comments
 (0)