Skip to content

Commit a057ac8

Browse files
committed
Move Injection Types article to topic
1 parent 8ef423f commit a057ac8

File tree

2 files changed

+44
-45
lines changed

2 files changed

+44
-45
lines changed

_build/redirection_map

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@
257257
/components/dependency_injection/parent_services /service_container/parent_services
258258
/components/dependency_injection/synthetic_services /service_container/synthetic_services
259259
/components/dependency_injection/tags /service_container/tags
260+
/components/dependency_injection/types /service_container/injection_types
260261
/components/event_dispatcher/introduction /components/event_dispatcher
261262
/components/expression_language/introduction /components/expression_language
262263
/components/expression_language/index /components/expression_language

components/dependency_injection/types.rst renamed to service_container/injection_types.rst

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@ The most common way to inject dependencies is via a class's constructor.
1919
To do this you need to add an argument to the constructor signature to accept
2020
the dependency::
2121

22+
namespace AppBundle\Mail\NewsletterManager;
23+
24+
// ...
2225
class NewsletterManager
2326
{
2427
protected $mailer;
2528

26-
public function __construct(\Mailer $mailer)
29+
public function __construct(MailerInterface $mailer)
2730
{
2831
$this->mailer = $mailer;
2932
}
@@ -39,11 +42,11 @@ service container configuration:
3942
.. code-block:: yaml
4043
4144
services:
42-
my_mailer:
43-
# ...
44-
newsletter_manager:
45+
# ...
46+
47+
app.newsletter_manager:
4548
class: NewsletterManager
46-
arguments: ['@my_mailer']
49+
arguments: ['@mailer']
4750
4851
.. code-block:: xml
4952
@@ -53,12 +56,10 @@ service container configuration:
5356
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
5457
5558
<services>
56-
<service id="my_mailer">
57-
<!-- ... -->
58-
</service>
59+
<!-- ... -->
5960
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"/>
6263
</service>
6364
</services>
6465
</container>
@@ -68,10 +69,10 @@ service container configuration:
6869
use Symfony\Component\DependencyInjection\Definition;
6970
use Symfony\Component\DependencyInjection\Reference;
7071
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'))
7576
));
7677
7778
.. tip::
@@ -104,11 +105,12 @@ Setter Injection
104105
Another possible injection point into a class is by adding a setter method
105106
that accepts the dependency::
106107

108+
// ...
107109
class NewsletterManager
108110
{
109-
protected $mailer;
111+
private $mailer;
110112

111-
public function setMailer(\Mailer $mailer)
113+
public function setMailer(MailerInterface $mailer)
112114
{
113115
$this->mailer = $mailer;
114116
}
@@ -121,12 +123,12 @@ that accepts the dependency::
121123
.. code-block:: yaml
122124
123125
services:
124-
my_mailer:
125-
# ...
126-
newsletter_manager:
127-
class: NewsletterManager
126+
# ...
127+
128+
app.newsletter_manager:
129+
class: AppBundle\Mail\NewsletterManager
128130
calls:
129-
- [setMailer, ['@my_mailer']]
131+
- [setMailer, ['@mailer']]
130132
131133
.. code-block:: xml
132134
@@ -136,13 +138,11 @@ that accepts the dependency::
136138
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
137139
138140
<services>
139-
<service id="my_mailer">
140-
<!-- ... -->
141-
</service>
141+
<!-- ... -->
142142
143-
<service id="newsletter_manager" class="NewsletterManager">
143+
<service id="app.newsletter_manager" class="AppBundle\Mail\NewsletterManager">
144144
<call method="setMailer">
145-
<argument type="service" id="my_mailer" />
145+
<argument type="service" id="mailer" />
146146
</call>
147147
</service>
148148
</services>
@@ -153,10 +153,10 @@ that accepts the dependency::
153153
use Symfony\Component\DependencyInjection\Definition;
154154
use Symfony\Component\DependencyInjection\Reference;
155155
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+
;
160160
161161
This time the advantages are:
162162

@@ -182,6 +182,7 @@ Property Injection
182182

183183
Another possibility is just setting public fields of the class directly::
184184

185+
// ...
185186
class NewsletterManager
186187
{
187188
public $mailer;
@@ -194,12 +195,12 @@ Another possibility is just setting public fields of the class directly::
194195
.. code-block:: yaml
195196
196197
services:
197-
my_mailer:
198-
# ...
199-
newsletter_manager:
200-
class: NewsletterManager
198+
# ...
199+
200+
app.newsletter_manager:
201+
class: AppBundle\Mail\NewsletterManager
201202
properties:
202-
mailer: '@my_mailer'
203+
mailer: '@mailer'
203204
204205
.. code-block:: xml
205206
@@ -209,12 +210,10 @@ Another possibility is just setting public fields of the class directly::
209210
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
210211
211212
<services>
212-
<service id="my_mailer">
213-
<!-- ... -->
214-
</service>
213+
<!-- ... -->
215214
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" />
218217
</service>
219218
</services>
220219
</container>
@@ -224,10 +223,10 @@ Another possibility is just setting public fields of the class directly::
224223
use Symfony\Component\DependencyInjection\Definition;
225224
use Symfony\Component\DependencyInjection\Reference;
226225
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+
;
231230
232231
There are mainly only disadvantages to using property injection, it is similar
233232
to setter injection but with these additional important problems:
@@ -242,4 +241,3 @@ to setter injection but with these additional important problems:
242241
But, it is useful to know that this can be done with the service container,
243242
especially if you are working with code that is out of your control, such
244243
as in a third party library, which uses public properties for its dependencies.
245-

0 commit comments

Comments
 (0)