@@ -179,6 +179,91 @@ The disadvantages of setter injection are:
179
179
* You cannot be sure the setter will be called and so you need to add checks
180
180
that any required dependencies are injected.
181
181
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
+
182
267
Property Injection
183
268
------------------
184
269
0 commit comments