From 2baf590aaed2f4f5c5b1b8be861469c9cda5e8d7 Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Wed, 31 Jan 2018 13:22:47 +0100 Subject: [PATCH 1/3] Documented how to get container parameters as a service --- service_container.rst | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/service_container.rst b/service_container.rst index 589c9484455..1ae11f52b2f 100644 --- a/service_container.rst +++ b/service_container.rst @@ -296,7 +296,7 @@ made. To do that, you create a new class:: ->addPart( 'Someone just updated the site. We told them: '.$happyMessage ); - + return $this->mailer->send($message) > 0; } } @@ -317,7 +317,7 @@ you can type-hint the new ``SiteUpdateManager`` class and use it:: if ($siteUpdateManager->notifyOfSiteUpdate()) { $this->addFlash('success', 'Notification mail was sent successfully.'); } - + // ... } @@ -690,6 +690,40 @@ argument for *any* service defined in this file! You can bind arguments by name The ``bind`` config can be also be applied to specific services or when loading many services at once (i.e. :ref:`service-psr4-loader`). +Getting Container Parameters as a Service +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. versionadded:: 4.1 + The ``ContainerBagInterface`` class was introduced in Symfony 4.1. + +If some service or controller needs lots of container parameters, there's an +easier alternative to binding all of them. Type-hint an argument with the +:class:`Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface` +class to inject all container parameters in a single object similar to the +:class:`Symfony\Component\DependencyInjection\ParameterBag\ParameterBag` objects +used in other parts of the framework:: + + // src/Service/MessageGenerator.php + // ... + + use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface; + + class MessageGenerator + { + private $params; + + public function __construct(ContainerBagInterface $params) + { + $this->params = $params; + } + + public function someMethod() + { + $parameterValue = $this->params->get('parameter_name'); + // ... + } + } + .. _services-autowire: The autowire Option From 3664ef133f1cdf0fd0a2226bc6135a8aa405a64a Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Wed, 31 Jan 2018 13:29:15 +0100 Subject: [PATCH 2/3] Fixed a syntax issue --- service_container.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/service_container.rst b/service_container.rst index 1ae11f52b2f..509edf37ada 100644 --- a/service_container.rst +++ b/service_container.rst @@ -700,8 +700,8 @@ If some service or controller needs lots of container parameters, there's an easier alternative to binding all of them. Type-hint an argument with the :class:`Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface` class to inject all container parameters in a single object similar to the -:class:`Symfony\Component\DependencyInjection\ParameterBag\ParameterBag` objects -used in other parts of the framework:: +:class:`Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag` +objects used in other parts of the framework:: // src/Service/MessageGenerator.php // ... From 3b6724a1afae01f8312ef5a82af1d610e7abe70b Mon Sep 17 00:00:00 2001 From: Javier Eguiluz Date: Thu, 1 Feb 2018 15:17:29 +0100 Subject: [PATCH 3/3] Rewords and improvements --- service_container.rst | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/service_container.rst b/service_container.rst index 509edf37ada..1a2dae67f4c 100644 --- a/service_container.rst +++ b/service_container.rst @@ -694,32 +694,34 @@ Getting Container Parameters as a Service ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. versionadded:: 4.1 - The ``ContainerBagInterface`` class was introduced in Symfony 4.1. + The feature to get container parameters as a service was introduced in Symfony 4.1. If some service or controller needs lots of container parameters, there's an -easier alternative to binding all of them. Type-hint an argument with the -:class:`Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface` -class to inject all container parameters in a single object similar to the -:class:`Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag` -objects used in other parts of the framework:: +easier alternative to binding all of them with the ``services._defaults.bind`` +option. Type-hint any of its constructor arguments with the +:class:`Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBagInterface` +or the new :class:`Symfony\\Component\\DependencyInjection\\ParameterBag\\ContainerBagInterface` +and the service will get all container parameters in a +:class:`Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag` object:: // src/Service/MessageGenerator.php // ... - use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface; + use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; class MessageGenerator { private $params; - public function __construct(ContainerBagInterface $params) + public function __construct(ParameterBagInterface $params) { $this->params = $params; } public function someMethod() { - $parameterValue = $this->params->get('parameter_name'); + // get any param from $this->params, which stores all container parameters + $sender = $this->params->get('mailer_sender'); // ... } }