Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2d7709f

Browse files
committed
[DependencyInjection] Invokable Factory Services
Document new invokable factories (and configurators) implemented in symfony/symfony#30255.
1 parent c63bd46 commit 2d7709f

File tree

2 files changed

+142
-0
lines changed

2 files changed

+142
-0
lines changed

service_container/configurators.rst

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,78 @@ the service id and the method name:
195195
# old syntax
196196
configurator: ['@App\Mail\EmailConfigurator', configure]
197197
198+
.. _configurators-invokable:
199+
200+
.. versionadded:: 4.3
201+
202+
Invokable configurators for services were introduced in Symfony 4.3.
203+
204+
Services can be configured via invokable configurators (replacing the
205+
``configure()`` method with ``__invoke()``) by omitting the method name, just as
206+
route definitions can reference :ref:`invokable
207+
controllers <controller-service-invoke>`.
208+
209+
.. code-block:: yaml
210+
211+
# app/config/services.yml
212+
services:
213+
# ...
214+
215+
# Registers all 4 classes as services, including AppBundle\Mail\EmailConfigurator
216+
AppBundle\:
217+
resource: '../../src/AppBundle/*'
218+
# ...
219+
220+
# override the services to set the configurator
221+
AppBundle\Mail\NewsletterManager:
222+
configurator: '@AppBundle\Mail\EmailConfigurator'
223+
224+
AppBundle\Mail\GreetingCardManager:
225+
configurator: '@AppBundle\Mail\EmailConfigurator'
226+
227+
.. code-block:: xml
228+
229+
<!-- app/config/services.xml -->
230+
<?xml version="1.0" encoding="UTF-8" ?>
231+
<container xmlns="http://symfony.com/schema/dic/services"
232+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
233+
xsi:schemaLocation="http://symfony.com/schema/dic/services
234+
http://symfony.com/schema/dic/services/services-1.0.xsd">
235+
236+
<services>
237+
<prototype namespace="AppBundle\" resource="../../src/AppBundle/*" />
238+
239+
<service id="AppBundle\Mail\NewsletterManager">
240+
<configurator service="AppBundle\Mail\EmailConfigurator" />
241+
</service>
242+
243+
<service id="AppBundle\Mail\GreetingCardManager">
244+
<configurator service="AppBundle\Mail\EmailConfigurator" />
245+
</service>
246+
</services>
247+
</container>
248+
249+
.. code-block:: php
250+
251+
// app/config/services.php
252+
use AppBundle\Mail\GreetingCardManager;
253+
use AppBundle\Mail\NewsletterManager;
254+
use Symfony\Component\DependencyInjection\Definition;
255+
use Symfony\Component\DependencyInjection\Reference;
256+
257+
// Same as before
258+
$definition = new Definition();
259+
260+
$definition->setAutowired(true);
261+
262+
$this->registerClasses($definition, 'AppBundle\\', '../../src/AppBundle/*');
263+
264+
$container->getDefinition(NewsletterManager::class)
265+
->setConfigurator(new Reference(EmailConfigurator::class));
266+
267+
$container->getDefinition(GreetingCardManager::class)
268+
->setConfigurator(new Reference(EmailConfigurator::class));
269+
198270
That's it! When requesting the ``App\Mail\NewsletterManager`` or
199271
``App\Mail\GreetingCardManager`` service, the created instance will first be
200272
passed to the ``EmailConfigurator::configure()`` method.

service_container/factories.rst

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,76 @@ Configuration of the service container then looks like this:
157157
# old syntax
158158
factory: ['@App\Email\NewsletterManagerFactory', createNewsletterManager]
159159
160+
.. _factories-invokable:
161+
162+
Suppose you now change your factory method to ``__invoke()`` so that your
163+
factory service can be used as a callback::
164+
165+
class InvokableNewsletterManagerFactory
166+
{
167+
public function __invoke()
168+
{
169+
$newsletterManager = new NewsletterManager();
170+
171+
// ...
172+
173+
return $newsletterManager;
174+
}
175+
}
176+
177+
.. versionadded:: 4.3
178+
179+
Invokable factories for services were introduced in Symfony 4.3.
180+
181+
Services can be created and configured via invokable factories by omitting the
182+
method name, just as route definitions can reference :ref:`invokable
183+
controllers <controller-service-invoke>`.
184+
185+
.. configuration-block::
186+
187+
.. code-block:: yaml
188+
189+
# app/config/services.yml
190+
191+
services:
192+
# ...
193+
194+
AppBundle\Email\NewsletterManager:
195+
class: AppBundle\Email\NewsletterManager
196+
factory: '@AppBundle\Email\NewsletterManagerFactory'
197+
198+
.. code-block:: xml
199+
200+
<!-- app/config/services.xml -->
201+
202+
<?xml version="1.0" encoding="UTF-8" ?>
203+
<container xmlns="http://symfony.com/schema/dic/services"
204+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
205+
xsi:schemaLocation="http://symfony.com/schema/dic/services
206+
http://symfony.com/schema/dic/services/services-1.0.xsd">
207+
208+
<services>
209+
<!-- ... -->
210+
211+
<service id="AppBundle\Email\NewsletterManager"
212+
class="AppBundle\Email\NewsletterManager">
213+
<factory service="AppBundle\Email\NewsletterManagerFactory" />
214+
</service>
215+
</services>
216+
</container>
217+
218+
.. code-block:: php
219+
220+
// app/config/services.php
221+
222+
use AppBundle\Email\NewsletterManager;
223+
use AppBundle\Email\NewsletterManagerFactory;
224+
use Symfony\Component\DependencyInjection\Reference;
225+
226+
// ...
227+
$container->register(NewsletterManager::class, NewsletterManager::class)
228+
->setFactory(new Reference(NewsletterManagerFactory::class));
229+
160230
.. _factories-passing-arguments-factory-method:
161231

162232
Passing Arguments to the Factory Method

0 commit comments

Comments
 (0)