|
4 | 4 | Defining Services Dependencies Automatically
|
5 | 5 | ============================================
|
6 | 6 |
|
| 7 | +.. versionadded:: 2.8 |
| 8 | + Support for autowiring services was introduced in Symfony 2.8. |
| 9 | + |
7 | 10 | Autowiring allows to register services in the container with minimal configuration.
|
8 |
| -It is useful in the field of `Rapid Application Development`_, when designing prototypes |
9 |
| -in early stages of large projects. It makes it easy to register a service graph |
10 |
| -and eases refactoring. |
| 11 | +It automatically resolves the service dependencies based on the constructor's |
| 12 | +typehint which is useful in the field of `Rapid Application Development`_, |
| 13 | +when designing prototypes in early stages of large projects. It makes it easy |
| 14 | +to register a service graph and eases refactoring. |
11 | 15 |
|
12 |
| -Imagine you're building an API to publish statuses on a Twitter feed, obfuscated |
13 |
| -with `ROT13`.. (a special case of the Caesar cipher). |
| 16 | +Imagine you're building an API to publish statuses on a Twitter feed, which |
| 17 | +has to be obfuscated with ``ROT13`` (a special case of the Caesar cipher). |
14 | 18 |
|
15 | 19 | Start by creating a ROT13 transformer class::
|
16 | 20 |
|
@@ -47,8 +51,9 @@ And now a Twitter client using this transformer::
|
47 | 51 | }
|
48 | 52 | }
|
49 | 53 |
|
50 |
| -The Dependency Injection Component will be able to automatically register the dependencies |
51 |
| -of this ``TwitterClient`` class by marking the ``twitter_client`` service as autowired: |
| 54 | +The DependencyInjection component will be able to automatically register |
| 55 | +the dependencies of this ``TwitterClient`` class when the ``twitter_client`` |
| 56 | +service is marked as autowired: |
52 | 57 |
|
53 | 58 | .. configuration-block::
|
54 | 59 |
|
@@ -133,9 +138,11 @@ Here is a typical controller using the ``twitter_client`` service::
|
133 | 138 | }
|
134 | 139 | }
|
135 | 140 |
|
136 |
| -You can give a try to the API with ``curl``:: |
| 141 | +You can give the API a try using ``curl``: |
| 142 | + |
| 143 | +.. code-block:: bash |
137 | 144 |
|
138 |
| - curl -d "user=kevin&key=ABCD&status=Hello" http://localhost:8000/tweet |
| 145 | + $ curl -d "user=kevin&key=ABCD&status=Hello" http://localhost:8000/tweet |
139 | 146 |
|
140 | 147 | It should return ``OK``.
|
141 | 148 |
|
@@ -316,20 +323,20 @@ and a Twitter client using it::
|
316 | 323 | # app/config/services.yml
|
317 | 324 | services:
|
318 | 325 | rot13_transformer:
|
319 |
| - class: 'AppBundle\Rot13Transformer' |
320 |
| - autowiring_types: 'AppBundle\TransformerInterface' |
| 326 | + class: AppBundle\Rot13Transformer |
| 327 | + autowiring_types: AppBundle\TransformerInterface |
321 | 328 |
|
322 | 329 | twitter_client:
|
323 |
| - class: 'AppBundle\TwitterClient' |
| 330 | + class: AppBundle\TwitterClient |
324 | 331 | autowire: true
|
325 | 332 |
|
326 | 333 | uppercase_rot13_transformer:
|
327 |
| - class: 'AppBundle\UppercaseRot13Transformer' |
| 334 | + class: AppBundle\UppercaseRot13Transformer |
328 | 335 | autowire: true
|
329 | 336 |
|
330 | 337 | uppercase_twitter_client:
|
331 |
| - class: 'AppBundle\TwitterClient' |
332 |
| - arguments: [ '@uppercase_rot13_transformer' ] |
| 338 | + class: AppBundle\TwitterClient |
| 339 | + arguments: ['@uppercase_rot13_transformer'] |
333 | 340 |
|
334 | 341 | .. code-block:: xml
|
335 | 342 |
|
@@ -373,16 +380,17 @@ and a Twitter client using it::
|
373 | 380 | $definition4->addArgument(new Reference('uppercase_rot13_transformer'));
|
374 | 381 | $container->setDefinition('uppercase_twitter_client', $definition4);
|
375 | 382 |
|
376 |
| -It deserves some explanations. We now have 2 services implementing the ``TransformerInterface``. |
377 |
| -The autowiring subsystem cannot guess which one to use, this leads to errors |
378 |
| -like:: |
| 383 | +This deserves some explanations. You now have two services implementing the |
| 384 | +``TransformerInterface``. The autowiring subsystem cannot guess which one |
| 385 | +to use which leads to errors like this: |
| 386 | + |
| 387 | +.. code-block:: text |
379 | 388 |
|
380 | 389 | [Symfony\Component\DependencyInjection\Exception\RuntimeException]
|
381 | 390 | Unable to autowire argument of type "AppBundle\TransformerInterface" for the service "twitter_client".
|
382 | 391 |
|
383 | 392 | Fortunately, the ``autowiring_types`` key is here to specify which implementation
|
384 |
| -to use by default. This key can take a list of types if necessary (using a YAML |
385 |
| -array). |
| 393 | +to use by default. This key can take a list of types if necessary. |
386 | 394 |
|
387 | 395 | Thanks to this setting, the ``rot13_transformer`` service is automatically injected
|
388 | 396 | as an argument of the ``uppercase_rot13_transformer`` and ``twitter_client`` services. For
|
|
0 commit comments