@@ -239,6 +239,82 @@ method name:
239239 ->factory(service(InvokableNewsletterManagerFactory::class));
240240 };
241241
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+
242318 .. _factories-passing-arguments-factory-method :
243319
244320Passing Arguments to the Factory Method
0 commit comments