8000 [DependencyInjection] Add `closure` argument type · symfony/symfony-docs@9013293 · GitHub
[go: up one dir, main page]

Skip to content

Commit 9013293

Browse files
[DependencyInjection] Add closure argument type
1 parent 828e566 commit 9013293

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

service_container.rst

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,100 @@ For a full list of *all* possible services in the container, run:
700700
701701
$ php bin/console debug:container
702702
703+
Injecting a Closure as an Argument
704+
----------------------------------
705+
706+
It is possible to inject a callable as an argument of a service.
707+
Let's add an argument to our ``MessageGenerator`` constructor::
708+
709+
// src/Service/MessageGenerator.php
710+
namespace App\Service;
711+
712+
use Psr\Log\LoggerInterface;
713+
714+
class MessageGenerator
715+
{
716+
private $logger;
717+
private $messageHash;
718+
719+
public function __construct(LoggerInterface $logger, callable $generateMessageHash)
720+
{
721+
$this->logger = $logger;
722+
$this->messageHash = $generateMessageHash();
723+
}
724+
// ...
725+
}
726+
727+
Now, we would add a new invokable service to generate the message hash::
728+
729+
// src/Hash/MessageHashGenerator.php
730+
namespace App\Hash;
731+
732+
class MessageHashGenerator
733+
{
734+
public function __invoke(): string
735+
{
736+
// Compute and return a message hash
737+
}
738+
}
739+
740+
Our configuration looks like this:
741+
742+
.. configuration-block::
743+
744+
.. code-block:: yaml
745+
746+
# config/services.yaml
747+
services:
748+
# ... same code as before
749+
750+
# explicitly configure the service
751+
App\Service\MessageGenerator:
752+
arguments:
753+
$logger: '@monolog.logger.request'
754+
$generateMessageHash: !closure '@App\Hash\MessageHashGenerator'
755+
756+
.. code-block:: xml
757+
758+
<!-- config/services.xml -->
759+
<?xml version="1.0" encoding="UTF-8" ?>
760+
<container xmlns="http://symfony.com/schema/dic/services"
761+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
762+
xsi:schemaLocation="http://symfony.com/schema/dic/services
763+
https://symfony.com/schema/dic/services/services-1.0.xsd">
764+
765+
<services>
766+
<!-- ... same code as before -->
767+
768+
<!-- Explicitly configure the service -->
769+
<service id="App\Service\MessageGenerator">
770+
<argument key="$logger" type="service" id="monolog.logger.request"/>
771+
<argument key="$generateMessageHash" type="closure" id="App\Hash\MessageHashGenerator"/>
772+
</service>
773+
</services>
774+
</container>
775+
776+
.. code-block:: php
777+
778+
// config/services.php
779+
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
780+
781+
use App\Service\MessageGenerator;
782+
783+
return function(ContainerConfigurator $containerConfigurator) {
784+
// ... same code as before
785+
786+
// explicitly configure the service
787+
$services->set(MessageGenerator::class)
788+
->arg('$logger', service('monolog.logger.request'))
789+
->arg('$generateMessageHash', closure('App\Hash\MessageHashGenerator'))
790+
;
791+
};
792+
793+
.. versionadded:: 6.1
794+
795+
The ``closure`` argument type was introduced in Symfony 6.1.
796+
703797
.. _services-binding:
704798

705799
Binding Arguments by Name or Type

0 commit comments

Comments
 (0)
0