Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3bd17af

Browse filesBrowse 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
Copy full SHA for 3bd17af

File tree

Expand file treeCollapse file tree

1 file changed

+44
-83
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+44
-83
lines changed

‎components/dependency_injection/factories.rst

Copy file name to clipboardExpand all lines: components/dependency_injection/factories.rst
+44-83Lines 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
@@ -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)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.