@@ -19,11 +19,14 @@ The most common way to inject dependencies is via a class's constructor.
19
19
To do this you need to add an argument to the constructor signature to accept
20
20
the dependency::
21
21
22
+ namespace AppBundle\Mail\NewsletterManager;
23
+
24
+ // ...
22
25
class NewsletterManager
23
26
{
24
27
protected $mailer;
25
28
26
- public function __construct(\Mailer $mailer)
29
+ public function __construct(MailerInterface $mailer)
27
30
{
28
31
$this->mailer = $mailer;
29
32
}
@@ -39,11 +42,11 @@ service container configuration:
39
42
.. code-block :: yaml
40
43
41
44
services :
42
- my_mailer :
43
- # ...
44
- newsletter_manager :
45
+ # ...
46
+
47
+ app. newsletter_manager :
45
48
class : NewsletterManager
46
- arguments : ['@my_mailer ']
49
+ arguments : ['@mailer ']
47
50
48
51
.. code-block :: xml
49
52
@@ -53,12 +56,10 @@ service container configuration:
53
56
xsi : schemaLocation =" http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd" >
54
57
55
58
<services >
56
- <service id =" my_mailer" >
57
- <!-- ... -->
58
- </service >
59
+ <!-- ... -->
59
60
60
- <service id =" newsletter_manager" class =" NewsletterManager" >
61
- <argument type =" service" id =" my_mailer " />
61
+ <service id =" app. newsletter_manager" class =" AppBundle\Mail\ NewsletterManager" >
62
+ <argument type =" service" id =" mailer " />
62
63
</service >
63
64
</services >
64
65
</container >
@@ -68,10 +69,10 @@ service container configuration:
68
69
use Symfony\Component\DependencyInjection\Definition;
69
70
use Symfony\Component\DependencyInjection\Reference;
70
71
71
- $container->setDefinition('my_mailer', ...);
72
- $container->setDefinition('newsletter_manager', new Definition(
73
- 'NewsletterManager',
74
- array(new Reference('my_mailer '))
72
+ // ...
73
+ $container->setDefinition('app. newsletter_manager', new Definition(
74
+ 'AppBundle\Mail\ NewsletterManager',
75
+ array(new Reference('mailer '))
75
76
));
76
77
77
78
.. tip ::
@@ -104,11 +105,12 @@ Setter Injection
104
105
Another possible injection point into a class is by adding a setter method
105
106
that accepts the dependency::
106
107
108
+ // ...
107
109
class NewsletterManager
108
110
{
109
- protected $mailer;
111
+ private $mailer;
110
112
111
- public function setMailer(\Mailer $mailer)
113
+ public function setMailer(MailerInterface $mailer)
112
114
{
113
115
$this->mailer = $mailer;
114
116
}
@@ -121,12 +123,12 @@ that accepts the dependency::
121
123
.. code-block :: yaml
122
124
123
125
services :
124
- my_mailer :
125
- # ...
126
- newsletter_manager :
127
- class : NewsletterManager
126
+ # ...
127
+
128
+ app. newsletter_manager :
129
+ class : AppBundle\Mail\ NewsletterManager
128
130
calls :
129
- - [setMailer, ['@my_mailer ']]
131
+ - [setMailer, ['@mailer ']]
130
132
131
133
.. code-block :: xml
132
134
@@ -136,13 +138,11 @@ that accepts the dependency::
136
138
xsi : schemaLocation =" http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd" >
137
139
138
140
<services >
139
- <service id =" my_mailer" >
140
- <!-- ... -->
141
- </service >
141
+ <!-- ... -->
142
142
143
- <service id =" newsletter_manager" class =" NewsletterManager" >
143
+ <service id =" app. newsletter_manager" class =" AppBundle\Mail\ NewsletterManager" >
144
144
<call method =" setMailer" >
145
- <argument type =" service" id =" my_mailer " />
145
+ <argument type =" service" id =" mailer " />
146
146
</call >
147
147
</service >
148
148
</services >
@@ -153,10 +153,10 @@ that accepts the dependency::
153
153
use Symfony\Component\DependencyInjection\Definition;
154
154
use Symfony\Component\DependencyInjection\Reference;
155
155
156
- $container->setDefinition('my_mailer', ...);
157
- $container->setDefinition(' newsletter_manager', new Definition(
158
- 'NewsletterManager'
159
- ))->addMethodCall('setMailer', array(new Reference('my_mailer'))) ;
156
+ // ...
157
+ $container->register('app. newsletter_manager', 'AppBundle\Mail\NewsletterManager')
158
+ ->addMethodCall('setMailer', array(new Reference('mailer')))
159
+ ;
160
160
161
161
This time the advantages are:
162
162
@@ -182,6 +182,7 @@ Property Injection
182
182
183
183
Another possibility is just setting public fields of the class directly::
184
184
185
+ // ...
185
186
class NewsletterManager
186
187
{
187
188
public $mailer;
@@ -194,12 +195,12 @@ Another possibility is just setting public fields of the class directly::
194
195
.. code-block :: yaml
195
196
196
197
services :
197
- my_mailer :
198
- # ...
199
- newsletter_manager :
200
- class : NewsletterManager
198
+ # ...
199
+
200
+ app. newsletter_manager :
201
+ class : AppBundle\Mail\ NewsletterManager
201
202
properties :
202
- mailer : ' @my_mailer '
203
+ mailer : ' @mailer '
203
204
204
205
.. code-block :: xml
205
206
@@ -209,12 +210,10 @@ Another possibility is just setting public fields of the class directly::
209
210
xsi : schemaLocation =" http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd" >
210
211
211
212
<services >
212
- <service id =" my_mailer" >
213
- <!-- ... -->
214
- </service >
213
+ <!-- ... -->
215
214
216
- <service id =" newsletter_manager" class =" NewsletterManager" >
217
- <property name =" mailer" type =" service" id =" my_mailer " />
215
+ <service id =" app. newsletter_manager" class =" AppBundle\Mail\ NewsletterManager" >
216
+ <property name =" mailer" type =" service" id =" mailer " />
218
217
</service >
219
218
</services >
220
219
</container >
@@ -224,10 +223,10 @@ Another possibility is just setting public fields of the class directly::
224
223
use Symfony\Component\DependencyInjection\Definition;
225
224
use Symfony\Component\DependencyInjection\Reference;
226
225
227
- $container->setDefinition('my_mailer', ...);
228
- $container->setDefinition ('newsletter_manager', new Definition(
229
- 'NewsletterManager'
230
- ))->setProperty('mailer', new Reference('my_mailer')) ;
226
+ // ...
227
+ $container->register ('newsletter_manager', 'AppBundle\Mail\NewsletterManager')
228
+ ->setProperty('mailer', new Reference('mailer'))
229
+ ;
231
230
232
231
There are mainly only disadvantages to using property injection, it is similar
233
232
to setter injection but with these additional important problems:
@@ -242,4 +241,3 @@ to setter injection but with these additional important problems:
242
241
But, it is useful to know that this can be done with the service container,
243
242
especially if you are working with code that is out of your control, such
244
243
as in a third party library, which uses public properties for its dependencies.
245
-
0 commit comments