10000
We read every piece of feedback, and take your input very seriously.
1 parent c63bd46 commit 2d7709fCopy full SHA for 2d7709f
service_container/configurators.rst
@@ -195,6 +195,78 @@ the service id and the method name:
195
# old syntax
196
configurator: ['@App\Mail\EmailConfigurator', configure]
197
198
+.. _configurators-invokable:
199
+
200
+.. versionadded:: 4.3
201
202
+ Invokable configurators for services were introduced in Symfony 4.3.
203
204
+Services can be configured via invokable configurators (replacing the
205
+``configure()`` method with ``__invoke()``) by omitting the method name, just as
206
+route definitions can reference :ref:`invokable
207
+controllers <controller-service-invoke>`.
208
209
+.. code-block:: yaml
210
211
+ # app/config/services.yml
212
+ services:
213
+ # ...
214
215
+ # Registers all 4 classes as services, including AppBundle\Mail\EmailConfigurator
216
+ AppBundle\:
217
+ resource: '../../src/AppBundle/*'
218
219
220
+ # override the services to set the configurator
221
+ AppBundle\Mail\NewsletterManager:
222
+ configurator: '@AppBundle\Mail\EmailConfigurator'
223
224
+ AppBundle\Mail\GreetingCardManager:
225
226
227
+.. code-block:: xml
228
229
+ <!-- app/config/services.xml -->
230
+ <?xml version="1.0" encoding="UTF-8" ?>
231
+ <container xmlns="http://symfony.com/schema/dic/services"
232
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
233
+ xsi:schemaLocation="http://symfony.com/schema/dic/services
234
+ http://symfony.com/schema/dic/services/services-1.0.xsd">
235
236
+ <services>
237
+ <prototype namespace="AppBundle\" resource="../../src/AppBundle/*" />
238
239
+ <service id="AppBundle\Mail\NewsletterManager">
240
+ <configurator service="AppBundle\Mail\EmailConfigurator" />
241
+ </service>
242
243
+ <service id="AppBundle\Mail\GreetingCardManager">
244
245
246
+ </services>
247
+ </container>
248
249
+.. code-block:: php
250
251
+ // app/config/services.php
252
+ use AppBundle\Mail\GreetingCardManager;
253
+ use AppBundle\Mail\NewsletterManager;
254
+ use Symfony\Component\DependencyInjection\Definition;
255
+ use Symfony\Component\DependencyInjection\Reference;
256
257
+ // Same as before
258
+ $definition = new Definition();
259
260
+ $definition->setAutowired(true);
261
262
+ $this->registerClasses($definition, 'AppBundle\\', '../../src/AppBundle/*');
263
264
+ $container->getDefinition(NewsletterManager::class)
265
+ ->setConfigurator(new Reference(EmailConfigurator::class));
266
267
+ $container->getDefinition(GreetingCardManager::class)
268
269
270
That's it! When requesting the ``App\Mail\NewsletterManager`` or
271
``App\Mail\GreetingCardManager`` service, the created instance will first be
272
passed to the ``EmailConfigurator::configure()`` method.
service_container/factories.rst
@@ -157,6 +157,76 @@ Configuration of the service container then looks like this:
157
158
factory: ['@App\Email\NewsletterManagerFactory', createNewsletterManager]
159
160
+.. _factories-invokable:
161
162
+Suppose you now change your factory method to ``__invoke()`` so that your
163
+factory service can be used as a callback::
164
165
+ class InvokableNewsletterManagerFactory
166
+ {
167
+ public function __invoke()
168
169
+ $newsletterManager = new NewsletterManager();
170
171
+ // ...
172
173
+ return $newsletterManager;
174
+ }
175
176
177
178
179
+ Invokable factories for services were introduced in Symfony 4.3.
180
181
+Services can be created and configured via invokable factories by omitting the
182
+method name, just as route definitions can reference :ref:`invokable
183
184
185
+.. configuration-block::
186
187
+ .. code-block:: yaml
188
189
190
191
192
193
194
+ AppBundle\Email\NewsletterManager:
+ class: AppBundle\Email\NewsletterManager
+ factory: '@AppBundle\Email\NewsletterManagerFactory'
+ .. code-block:: xml
+ <!-- ... -->
+ <service id="AppBundle\Email\NewsletterManager"
+ class="AppBundle\Email\NewsletterManager">
+ <factory service="AppBundle\Email\NewsletterManagerFactory" />
+ .. code-block:: php
+ use AppBundle\Email\NewsletterManager;
+ use AppBundle\Email\NewsletterManagerFactory;
+ $container->register(NewsletterManager::class, NewsletterManager::class)
+ ->setFactory(new Reference(NewsletterManagerFactory::class));
.. _factories-passing-arguments-factory-method:
Passing Arguments to the Factory Method