@@ -744,15 +744,75 @@ Injecting the dependency by the setter method just needs a change of syntax:
744744 and "setter injection". The Symfony service container also supports
745745 "property injection".
746746
747- Making References optional
747+ Making References Optional
748748--------------------------
749749
750750Sometimes, one of your services may have an optional dependency, meaning
751751that the dependency is not required for your service to work properly. In
752752the example above, the ``app.mailer `` service *must * exist, otherwise an exception
753753will be thrown. By modifying the ``app.newsletter_manager `` service definition,
754- you can make this reference optional. The container will then inject it if
755- it exists and do nothing if it doesn't:
754+ you can make this reference optional, there are two strategies for doing this.
755+
756+ Setting Missing Dependencies to null
757+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
758+
759+ You can use the ``null `` strategy to explicitly set the argument to ``null ``
760+ if the service does not exist:
761+
762+ .. configuration-block ::
763+
764+ .. code-block :: xml
765+
766+ <!-- app/config/services.xml -->
767+ <?xml version =" 1.0" encoding =" UTF-8" ?>
768+ <container xmlns =" http://symfony.com/schema/dic/services"
769+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
770+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
771+ http://symfony.com/schema/dic/services/services-1.0.xsd" >
772+
773+ <services >
774+ <service id =" app.mailer" >
775+ <!-- ... -->
776+ </service >
777+
778+ <service id =" app.newsletter_manager" class =" AppBundle\Newsletter\NewsletterManager" >
779+ <argument type =" service" id =" app.mailer" on-invalid =" null" />
780+ </service >
781+ </services >
782+ </container >
783+
784+ .. code-block :: php
785+
786+ // app/config/services.php
787+ use Symfony\Component\DependencyInjection\Definition;
788+ use Symfony\Component\DependencyInjection\Reference;
789+ use Symfony\Component\DependencyInjection\ContainerInterface;
790+
791+ $container->setDefinition('app.mailer', ...);
792+
793+ $container->setDefinition('app.newsletter_manager', new Definition(
794+ 'AppBundle\Newsletter\NewsletterManager',
795+ array(
796+ new Reference(
797+ 'app.mailer',
798+ ContainerInterface::NULL_ON_INVALID_REFERENCE
799+ )
800+ )
801+ ));
802+
803+ .. note ::
804+
805+ The "null" strategy is not currently supported by the YAML driver.
806+
807+ Ignoring Missing Dependencies
808+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
809+
810+ The behavior of ignoring missing dependencies is the same as the "null"
811+ behavior except when used within a method call, in which case the method call
812+ itself will be removed.
813+
814+ In the following example the container will inject a service using a method
815+ call if the service exists and remove the method call if it does not:
756816
757817.. configuration-block ::
758818
@@ -779,7 +839,9 @@ it exists and do nothing if it doesn't:
779839 </service >
780840
781841 <service id =" app.newsletter_manager" class =" AppBundle\Newsletter\NewsletterManager" >
782- <argument type =" service" id =" app.mailer" on-invalid =" ignore" />
842+ <call method =" setMailer" >
843+ <argument type =" service" id =" my_mailer" on-invalid =" ignore" />
844+ </call >
783845 </service >
784846 </services >
785847 </container >
@@ -794,13 +856,12 @@ it exists and do nothing if it doesn't:
794856 $container->setDefinition('app.mailer', ...);
795857
796858 $container->setDefinition('app.newsletter_manager', new Definition(
797- 'AppBundle\Newsletter\NewsletterManager',
798- array(
799- new Reference(
800- 'app.mailer',
801- ContainerInterface::IGNORE_ON_INVALID_REFERENCE
802- )
803- )
859+ 'AppBundle\Newsletter\NewsletterManager'
860+ ))->addMethodCall('setMailer', array(
861+ new Reference(
862+ 'my_mailer',
863+ ContainerInterface::IGNORE_ON_INVALID_REFERENCE
864+ ),
804865 ));
805866
806867 In YAML, the special ``@? `` syntax tells the service container that the dependency
0 commit comments