@@ -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+
182267Property Injection
183268------------------
184269
0 commit comments