Contributed by
Martin Hasoň
and Nicolas Grekas
in #21133.
Services in Symfony applications are traditionally defined in YAML, XML or PHP configuration files. A typical but simple service definition looks like this in YAML:
1 2 3 4 5 | # app/config/services.yml
services:
app.mailer:
class: AppBundle\Mailer
arguments: [sendmail]
|
And like this in XML:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <!-- app/config/services.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services
http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="app.mailer" class="AppBundle\Mailer">
<argument>sendmail</argument>
</service>
</services>
</container>
|
In Symfony 3.3, we're adding some new features to the Dependency Injection component
that allow working with services in a different manner. For that reason, in
Symfony 3.3, the class
argument of the services is now optional. When it's
undefined, Symfony considers that the id
of the service is the PHP class:
1 2 3 4 5 6 7 8 9 10 | services:
# ...
# traditional service definition
app.manager.user:
class: AppBundle\EventListener\UserManager
tags: ['kernel.event_subscriber']
# new service definition allowed in Symfony 3.3
AppBundle\EventListener\UserManager:
tags: ['kernel.event_subscriber']
|
When using this new feature, getting services from the container requires to pass the full PHP namespace:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | use AppBundle\EventListener\UserManager;
// ...
public function editAction()
{
// ...
// before Symfony 3.3
$this->get('app.manager.user')->save($user);
// Symfony 3.3
$this->get(UserManager::class)->save($user);
// ...
}
|
The traditional service definition will keep working as always (and it's even mandatory to use it in cases like decorating services). However, this new feature together with other optional features such as autowiring and defining default service options per file, will enable RAD ("rapid application development") for those projects and developers that need it:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | services:
# default options applied to all the services in this file
_defaults:
# enable autowiring for these services
autowire: true
# make services private by default
public: false
App\TwigExtension:
tags: [twig.extension]
App\Doc:
tags:
- { name: twig.runtime, id: "App\\TwigExtension" }
|
What a Symfony developer should know about the framework: News, Jobs, Tweets, Events, Videos,...