8000 minor #4518 [Components][DependencyInjection] backport service factor… · symfony/symfony-docs@3bd17af · GitHub
[go: up one dir, main page]

Skip to content

Commit 3bd17af

Browse files
committed
minor #4518 [Components][DependencyInjection] backport service factory improvements (xabbuh)
This PR was merged into the 2.3 branch. Discussion ---------- [Components][DependencyInjection] backport service factory improvements | Q | A | ------------- | --- | Doc fix? | no | New docs? | no | Applies to | all | Fixed tickets | Commits ------- c787637 backport service factory improvements
2 parents 9b330ef + c787637 commit 3bd17af

File tree

1 file changed

+44
-83
lines changed

1 file changed

+44
-83
lines changed

components/dependency_injection/factories.rst

Lines changed: 44 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ the class.
1515
Suppose you have a factory that configures and returns a new ``NewsletterManager``
1616
object::
1717

18-
class NewsletterFactory
18+
class NewsletterManagerFactory
1919
{
20-
public function get()
20+
public static function createNewsletterManager()
2121
{
2222
$newsletterManager = new NewsletterManager();
2323

@@ -28,22 +28,18 @@ object::
2828
}
2929

3030
To make the ``NewsletterManager`` object available as a service, you can
31-
configure the service container to use the ``NewsletterFactory`` factory
31+
configure the service container to use the ``NewsletterManagerFactory`` factory
3232
class:
3333

3434
.. configuration-block::
3535

3636
.. code-block:: yaml
3737
38-
parameters:
39-
# ...
40-
newsletter_manager.class: NewsletterManager
41-
newsletter_factory.class: NewsletterFactory
4238
services:
4339
newsletter_manager:
44-
class: "%newsletter_manager.class%"
45-
factory_class: "%newsletter_factory.class%"
46-
factory_method: get
40+
class: NewsletterManager
41+
factory_class: NewsletterManagerFactory
42+
factory_method: createNewsletterManager
4743
4844
.. code-block:: xml
4945
@@ -52,18 +48,12 @@ class:
5248
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5349
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
5450
55-
<parameters>
56-
<!-- ... -->
57-
<parameter key="newsletter_manager.class">NewsletterManager</parameter>
58-
<parameter key="newsletter_factory.class">NewsletterFactory</parameter>
59-
</parameters>
60-
6151
<services>
6252
<service
6353
id="newsletter_manager"
64-
class="%newsletter_manager.class%"
65-
factory-class="%newsletter_factory.class%"
66-
factory-method="get" />
54+
class="NewsletterManager"
55+
factory-class="NewsletterManagerFactory"
56+
factory-method="createNewsletterManager" />
6757
</services>
6858
</services>
6959
@@ -72,35 +62,29 @@ class:
7262
use Symfony\Component\DependencyInjection\Definition;
7363
7464
// ...
75-
$container->setParameter('newsletter_manager.class', 'NewsletterManager');
76-
$container->setParameter('newsletter_factory.class', 'NewsletterFactory');
77-
78-
$definition = new Definition('%newsletter_manager.class%');
79-
$definition->setFactoryClass('%newsletter_factory.class%');
80-
$definition->setFactoryMethod('get');
65+
$definition = new Definition('NewsletterManager');
66+
$definition->setFactoryClass('NewsletterManagerFactory');
67+
$definition->setFactoryMethod('createNewsletterManager');
8168
8269
$container->setDefinition('newsletter_manager', $definition);
8370
8471
When you specify the class to use for the factory (via ``factory_class``)
8572
the method will be called statically. If the factory itself should be instantiated
8673
and the resulting object's method called, configure the factory itself as a service.
87-
In this case, the method (e.g. get) should be changed to be non-static:
74+
In this case, the method (e.g. ``createNewsletterManager``) should be changed
75+
to be non-static:
8876

8977
.. configuration-block::
9078

9179
.. code-block:: yaml
9280
93-
parameters:
94-
# ...
95-
newsletter_manager.class: NewsletterManager
96-
newsletter_factory.class: NewsletterFactory
9781
services:
98-
newsletter_factory:
99-
class: "%newsletter_factory.class%"
82+
newsletter_manager_factory:
83+
class: NewsletterManagerFactory
10084
newsletter_manager:
101-
class: "%newsletter_manager.class%"
102-
factory_service: newsletter_factory
103-
factory_method: get
85+
class: NewsletterManager
86+
factory_service: newsletter_manager_factory
87+
factory_method: createNewsletterManager
10488
10589
.. code-block:: xml
10690
F438
@@ -109,40 +93,30 @@ In this case, the method (e.g. get) should be changed to be non-static:
10993
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
11094
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
11195
112-
<parameters>
113-
<!-- ... -->
114-
<parameter key="newsletter_manager.class">NewsletterManager</parameter>
115-
<parameter key="newsletter_factory.class">NewsletterFactory</parameter>
116-
</parameters>
117-
11896
<services>
119-
<service id="newsletter_factory" class="%newsletter_factory.class%"/>
97+
<service id="newsletter_manager_factory" class="NewsletterManagerFactory" />
12098
12199
<service
122100
id="newsletter_manager"
123-
class="%newsletter_manager.class%"
124-
factory-service="newsletter_factory"
125-
factory-method="get" />
101+
class="NewsletterManager"
102+
factory-service="newsletter_manager_factory"
103+
factory-method="createNewsletterManager" />
126104
</services>
127105
</container>
128106
129107
.. code-block:: php
130108
131109
use Symfony\Component\DependencyInjection\Definition;
132110
133-
// ...
134-
$container->setParameter('newsletter_manager.class', 'NewsletterManager');
135-
$container->setParameter('newsletter_factory.class', 'NewsletterFactory');
136-
137-
$container->setDefinition('newsletter_factory', new Definition(
138-
'%newsletter_factory.class%'
111+
$container->setDefinition('newsletter_manager_factory', new Definition(
112+
'NewsletterManager'
139113
));
140114
$container->setDefinition('newsletter_manager', new Definition(
141-
'%newsletter_manager.class%'
115+
'NewsletterManagerFactory'
142116
))->setFactoryService(
143-
'newsletter_factory'
117+
'newsletter_manager_factory'
144118
)->setFactoryMethod(
145-
'get'
119+
'createNewsletterManager'
146120
);
147121
148122
.. note::
@@ -155,24 +129,20 @@ Passing Arguments to the Factory Method
155129
---------------------------------------
156130

157131
If you need to pass arguments to the factory method, you can use the ``arguments``
158-
options inside the service container. For example, suppose the ``get`` method
159-
in the previous example takes the ``templating`` service as an argument:
132+
options inside the service container. For example, suppose the ``createNewsletterManager``
133+
method in the previous example takes the ``templating`` service as an argument:
160134

161135
.. configuration-block::
162136

163137
.. code-block:: yaml
164138
165-
parameters:
166-
# ...
167-
newsletter_manager.class: NewsletterManager
168-
newsletter_factory.class: NewsletterFactory
169139
services:
170-
newsletter_factory:
171-
class: "%newsletter_factory.class%"
140+
newsletter_manager_factory:
141+
class: NewsletterManagerFactory
172142
newsletter_manager:
173-
class: "%newsletter_manager.class%"
174-
factory_service: newsletter_factory
175-
factory_method: get
143+
class: NewsletterManager
144+
factory_service: newsletter_manager_factory
145+
factory_method: createNewsletterManager
176146
arguments:
177147
- "@templating"
178148
@@ -183,20 +153,14 @@ in the previous example takes the ``templating`` service as an argument:
183153
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
184154
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
185155
186-
<parameters>
187-
<!-- ... -->
188-
<parameter key="newsletter_manager.class">NewsletterManager</parameter>
189-
<parameter key="newsletter_factory.class">NewsletterFactory</parameter>
190-
</parameters>
191-
192156
<services>
193-
<service id="newsletter_factory" class="%newsletter_factory.class%"/>
157+
<service id="newsletter_manager_factory" class="NewsletterManagerFactory" />
194158
195159
<service
196160
id="newsletter_manager"
197-
class="%newsletter_manager.class%"
198-
factory-service="newsletter_factory"
199-
factory-method="get">
161+
class="NewsletterManager"
162+
factory-service="newsletter_manager_factory"
163+
factory-method="createNewsletterManager">
200164
201165
<argument type="service" id="templating" />
202166
</service>
@@ -208,17 +172,14 @@ in the previous example takes the ``templating`` service as an argument:
208172
use Symfony\Component\DependencyInjection\Definition;
209173
210174
// ...
211-
$container->setParameter('newsletter_manager.class', 'NewsletterManager');
212-
$container->setParameter('newsletter_factory.class', 'NewsletterFactory');
213-
214-
$container->setDefinition('newsletter_factory', new Definition(
215-
'%newsletter_factory.class%'
175+
$container->setDefinition('newsletter_manager_factory', new Definition(
176+
'NewsletterManagerFactory'
216177
));
217178
$container->setDefinition('newsletter_manager', new Definition(
218-
'%newsletter_manager.class%',
179+
'NewsletterManager',
219180
array(new Reference('templating'))
220181
))->setFactoryService(
221-
'newsletter_factory'
182+
'newsletter_manager_factory'
222183
)->setFactoryMethod(
223-
'get'
184+
'createNewsletterManager'
224185
);

0 commit comments

Comments
 (0)
0