@@ -239,6 +239,82 @@ method name:
239
239
->factory(service(InvokableNewsletterManagerFactory::class));
240
240
};
241
241
242
+ Using Expressions in Email Factories
243
+ --------------------------------------
244
+
245
+ .. versionadded :: 6.1
246
+
247
+ Using expressions as factories was introduced in Symfony 6.1.
248
+
249
+ Instead of using PHP classes as a factory, you can also use
250
+ :doc: `expressions </service_container/expressions >`. This allows you to
251
+ e.g. change the service based on a parameter:
252
+
253
+ .. configuration-block ::
254
+
255
+ .. code-block :: yaml
256
+
257
+ # config/services.yaml
258
+ services :
259
+ App\Email\NewsletterManagerInterface :
260
+ # use the "tracable_newsletter" service when debug is enabled, "newsletter" otherwise.
261
+ # "@=" indicates that this is an expression
262
+ factory : ' @=parameter("kernel.debug") ? service("tracable_newsletter") : service("newsletter")'
263
+
264
+ # you can use the arg() function to retrieve an argument from the definition
265
+ App\Email\NewsletterManagerInterface :
266
+ factory : " @=arg(0).createNewsletterManager() ?: service(" default_newsletter_manager")"
267
+ arguments :
268
+ - ' @App\Email\NewsletterManagerFactory'
269
+
270
+ .. code-block :: xml
271
+
272
+ <!-- config/services.xml -->
273
+ <?xml version =" 1.0" encoding =" UTF-8" ?>
274
+ <container xmlns =" http://symfony.com/schema/dic/services"
275
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
276
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
277
+ https://symfony.com/schema/dic/services/services-1.0.xsd" >
278
+
279
+ <services >
280
+ <service id =" App\Email\NewsletterManagerInterface" >
281
+ <!-- use the "tracable_newsletter" service when debug is enabled, "newsletter" otherwise -->
282
+ <factory expression =" parameter('kernel.debug') ? service('tracable_newsletter') : service('newsletter')" />
283
+ </service >
284
+
285
+ <!-- you can use the arg() function to retrieve an argument from the definition -->
286
+ <service id =" App\Email\NewsletterManagerInterface" >
287
+ <factory expression =" arg(0).createNewsletterManager() ?: service(" default_newsletter_manager" )" />
288
+ <argument type =" service" id =" App\Email\NewsletterManagerFactory" />
289
+ </service >
290
+ </services >
291
+ </container >
292
+
293
+ .. code-block :: php
294
+
295
+ // config/services.php
296
+ namespace Symfony\Component\DependencyInjection\Loader\Configurator;
297
+
298
+ use App\Email\NewsletterManagerInterface;
299
+ use App\Email\NewsletterManagerFactory;
300
+
301
+ return function(ContainerConfigurator $configurator) {
302
+ $services = $configurator->services();
303
+
304
+ $services->set(NewsletterManagerInterface::class)
305
+ // use the "tracable_newsletter" service when debug is enabled, "newsletter" otherwise.
306
+ ->factory(expr("parameter('kernel.debug') ? service('tracable_newsletter') : service('newsletter')"))
307
+ ;
308
+
309
+ // you can use the arg() function to retrieve an argument from the definition
310
+ $services->set(NewsletterManagerInterface::class)
311
+ ->factory(expr("arg(0).createNewsletterManager() ?: service('default_newsletter_manager')"))
312
+ ->args([
313
+ service(NewsletterManagerFactory::class),
314
+ ])
315
+ ;
316
+ };
317
+
242
318
.. _factories-passing-arguments-factory-method :
243
319
244
320
Passing Arguments to the Factory Method
0 commit comments