Skip to content

Commit 25ebe7c

Browse files
committed
Updated the bundle configuration articles to Symfony 4
1 parent 724e5c4 commit 25ebe7c

File tree

2 files changed

+55
-110
lines changed

2 files changed

+55
-110
lines changed

bundles/configuration.rst

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
How to Create Friendly Configuration for a Bundle
66
=================================================
77

8-
If you open your application configuration file (usually ``app/config/config.yml``),
9-
you'll see a number of different configuration sections, such as ``framework``,
10-
``twig`` and ``doctrine``. Each of these configures a specific bundle, allowing
11-
you to define options at a high level and then let the bundle make all the
12-
low-level, complex changes based on your settings.
8+
If you open your main application configuration directory (usually
9+
``config/packages/``), you'll see a number of different files, such as
10+
``framework.yaml``, ``twig.yaml`` and ``doctrine.yaml``. Each of these
11+
configures a specific bundle, allowing you to define options at a high level and
12+
then let the bundle make all the low-level, complex changes based on your
13+
settings.
1314

1415
For example, the following configuration tells the FrameworkBundle to enable the
1516
form integration, which involves the definition of quite a few services as well
@@ -46,13 +47,13 @@ as integration of other related components:
4647
.. sidebar:: Using Parameters to Configure your Bundle
4748

4849
If you don't have plans to share your bundle between projects, it doesn't
49-
make sense to use this more advanced way of configuration. Since you use
50-
the bundle only in one project, you can just change the service
51-
configuration each time.
50+
make sense to use this more advanced way of configuration. Since you use the
51+
bundle only in one project, you can just change the service configuration
52+
each time.
5253

5354
If you *do* want to be able to configure something from within
54-
``config.yml``, you can always create a parameter there and use that
55-
parameter somewhere else.
55+
``config/services.yaml``, you can always create a parameter there and use
56+
that parameter somewhere else.
5657

5758
Using the Bundle Extension
5859
--------------------------
@@ -71,15 +72,15 @@ bundle configuration would look like:
7172

7273
.. code-block:: yaml
7374
74-
# app/config/config.yml
75+
# config/packages/acme_social.yaml
7576
acme_social:
7677
twitter:
7778
client_id: 123
7879
client_secret: your_secret
7980
8081
.. code-block:: xml
8182
82-
<!-- app/config/config.xml -->
83+
<!-- config/packages/acme_social.xml -->
8384
<?xml version="1.0" ?>
8485
<container xmlns="http://symfony.com/schema/dic/services"
8586
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -96,7 +97,7 @@ bundle configuration would look like:
9697
9798
.. code-block:: php
9899
99-
// app/config/config.php
100+
// config/packages/acme_social.php
100101
$container->loadFromExtension('acme_social', array(
101102
'client_id' => 123,
102103
'client_secret' => 'your_secret',
@@ -145,20 +146,20 @@ For the configuration example in the previous section, the array passed to your
145146
)
146147

147148
Notice that this is an *array of arrays*, not just a single flat array of the
148-
configuration values. This is intentional, as it allows Symfony to parse
149-
several configuration resources. For example, if ``acme_social`` appears in
150-
another configuration file - say ``config_dev.yml`` - with different values
151-
beneath it, the incoming array might look like this::
149+
configuration values. This is intentional, as it allows Symfony to parse several
150+
configuration resources. For example, if ``acme_social`` appears in another
151+
configuration file - say ``config/packages/dev/acme_social.yaml`` - with
152+
different values beneath it, the incoming array might look like this::
152153

153154
array(
154-
// values from config.yml
155+
// values from config/packages/acme_social.yaml
155156
array(
156157
'twitter' => array(
157158
'client_id' => 123,
158159
'client_secret' => 'your_secret',
159160
),
160161
),
161-
// values from config_dev.yml
162+
// values from config/packages/dev/acme_social.yaml
162163
array(
163164
'twitter' => array(
164165
'client_id' => 456,
@@ -219,7 +220,6 @@ force validation (e.g. if an additional option was passed, an exception will be
219220
thrown)::
220221

221222
// src/Acme/SocialBundle/DependencyInjection/AcmeSocialExtension.php
222-
223223
public function load(array $configs, ContainerBuilder $container)
224224
{
225225
$configuration = new Configuration();
@@ -324,12 +324,10 @@ In your extension, you can load this and dynamically set its arguments::
324324
Modifying the Configuration of Another Bundle
325325
---------------------------------------------
326326

327-
If you have multiple bundles that depend on each other, it may be useful
328-
to allow one ``Extension`` class to modify the configuration passed to another
329-
bundle's ``Extension`` class, as if the end-developer has actually placed that
330-
configuration in their ``app/config/config.yml`` file. This can be achieved
331-
using a prepend extension. For more details, see
332-
:doc:`/bundles/prepend_extension`.
327+
If you have multiple bundles that depend on each other, it may be useful to
328+
allow one ``Extension`` class to modify the configuration passed to another
329+
bundle's ``Extension`` class. This can be achieved using a prepend extension.
330+
For more details, see :doc:`/bundles/prepend_extension`.
333331

334332
Dump the Configuration
335333
----------------------
@@ -401,7 +399,7 @@ namespace is then replaced with the XSD validation base path returned from
401399
method. This namespace is then followed by the rest of the path from the base
402400
path to the file itself.
403401

404-
By convention, the XSD file lives in the ``Resources/config/schema``, but you
402+
By convention, the XSD file lives in the ``Resources/config/schema/``, but you
405403
can place it anywhere you like. You should return this path as the base path::
406404

407405
// src/Acme/HelloBundle/DependencyInjection/AcmeHelloExtension.php
@@ -422,7 +420,7 @@ Assuming the XSD file is called ``hello-1.0.xsd``, the schema location will be
422420

423421
.. code-block:: xml
424422
425-
<!-- app/config/config.xml -->
423+
<!-- config/packages/acme_hello.xml -->
426424
<?xml version="1.0" ?>
427425
<container xmlns="http://symfony.com/schema/dic/services"
428426
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

bundles/extension.rst

Lines changed: 29 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,29 @@
55
How to Load Service Configuration inside a Bundle
66
=================================================
77

8-
In Symfony, you'll find yourself using many services. These services can be
9-
registered in the ``app/config/`` directory of your application. But when you
10-
want to decouple the bundle for use in other projects, you want to include the
11-
service configuration in the bundle itself. This article will teach you how to
12-
do that.
8+
Services created by bundles are not defined in the main ``config/services.yaml``
9+
file used by the application but in the bundles themselves. This article
10+
explains how to create and load those bundle services files.
1311

1412
Creating an Extension Class
1513
---------------------------
1614

1715
In order to load service configuration, you have to create a Dependency
18-
Injection (DI) Extension for your bundle. This class has some conventions in order
19-
to be detected automatically. But you'll later see how you can change it to
20-
your own preferences. By default, the Extension has to comply with the
21-
following conventions:
16+
Injection (DI) Extension for your bundle. By default, the Extension class must
17+
follow these conventions (but later you'll learn how to skip them if needed):
2218

2319
* It has to live in the ``DependencyInjection`` namespace of the bundle;
2420

21+
* It has to implement the :class:`Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface`,
22+
which is usually achieve by extending the
23+
:class:`Symfony\\Component\\DependencyInjection\\Extension\\Extension` class;
24+
2525
* The name is equal to the bundle name with the ``Bundle`` suffix replaced by
26-
``Extension`` (e.g. the Extension class of the AppBundle would be called
27-
``AppExtension`` and the one for AcmeHelloBundle would be called
26+
``Extension`` (e.g. the Extension class of the AcmeBundle would be called
27+
``AcmeExtension`` and the one for AcmeHelloBundle would be called
2828
``AcmeHelloExtension``).
2929

30-
The Extension class should implement the
31-
:class:`Symfony\\Component\\DependencyInjection\\Extension\\ExtensionInterface`,
32-
but usually you would simply extend the
33-
:class:`Symfony\\Component\\DependencyInjection\\Extension\\Extension` class::
30+
This is how the extension of an AcmeHelloBundle should look like::
3431

3532
// src/Acme/HelloBundle/DependencyInjection/AcmeHelloExtension.php
3633
namespace Acme\HelloBundle\DependencyInjection;
@@ -65,11 +62,11 @@ method to return the instance of the extension::
6562
}
6663
}
6764

68-
Since the new Extension class name doesn't follow the naming conventions, you
69-
should also override
65+
In addition, when the new Extension class name doesn't follow the naming
66+
conventions, you must also override the
7067
:method:`Extension::getAlias() <Symfony\\Component\\DependencyInjection\\Extension\\Extension::getAlias>`
71-
to return the correct DI alias. The DI alias is the name used to refer to the
72-
bundle in the container (e.g. in the ``app/config/config.yml`` file). By
68+
method to return the correct DI alias. The DI alias is the name used to refer to
69+
the bundle in the container (e.g. in the ``config/packages/`` files). By
7370
default, this is done by removing the ``Extension`` suffix and converting the
7471
class name to underscores (e.g. ``AcmeHelloExtension``'s DI alias is
7572
``acme_hello``).
@@ -86,11 +83,10 @@ container.
8683

8784
In the ``load()`` method, you can use PHP code to register service definitions,
8885
but it is more common if you put these definitions in a configuration file
89-
(using the Yaml, XML or PHP format). Luckily, you can use the file loaders in
90-
the extension!
86+
(using the YAML, XML or PHP format).
9187

9288
For instance, assume you have a file called ``services.xml`` in the
93-
``Resources/config`` directory of your bundle, your ``load()`` method looks like::
89+
``Resources/config/`` directory of your bundle, your ``load()`` method looks like::
9490

9591
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
9692
use Symfony\Component\Config\FileLocator;
@@ -105,46 +101,22 @@ For instance, assume you have a file called ``services.xml`` in the
105101
$loader->load('services.xml');
106102
}
107103

108-
Other available loaders are the ``YamlFileLoader``, ``PhpFileLoader`` and
109-
``IniFileLoader``.
110-
111-
.. note::
112-
113-
The ``IniFileLoader`` can only be used to load parameters and it can only
114-
load them as strings.
115-
116-
.. caution::
117-
118-
If you removed the default file with service definitions (i.e.
119-
``config/services.yaml``), make sure to also remove it from the
120-
``imports`` key in ``app/config/config.yml``.
104+
The other available loaders are ``YamlFileLoader`` and ``PhpFileLoader``.
121105

122106
Using Configuration to Change the Services
123107
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
124108

125109
The Extension is also the class that handles the configuration for that
126-
particular bundle (e.g. the configuration in ``app/config/config.yml``). To
127-
read more about it, see the ":doc:`/bundles/configuration`" article.
110+
particular bundle (e.g. the configuration in ``config/packages/<bundle_alias>.yaml``).
111+
To read more about it, see the ":doc:`/bundles/configuration`" article.
128112

129113
Adding Classes to Compile
130114
-------------------------
131115

132-
.. versionadded:: 3.3
133-
This technique is discouraged and the ``addClassesToCompile()`` method was
134-
deprecated in Symfony 3.3 because modern PHP versions make it unnecessary.
135-
136-
Symfony creates a big ``classes.php`` file in the cache directory to aggregate
137-
the contents of the PHP classes that are used in every request. This reduces the
138-
I/O operations and increases the application performance.
139-
140-
.. versionadded:: 3.2
141-
The ``addAnnotatedClassesToCompile()`` method was added in Symfony 3.2.
142-
143-
Your bundles can also add their own classes into this file thanks to the
144-
``addClassesToCompile()`` and ``addAnnotatedClassesToCompile()`` methods (both
145-
work in the same way, but the second one is for classes that contain PHP
146-
annotations). Define the classes to compile as an array of their fully qualified
147-
class names::
116+
Bundles can hint Symfony about which of their classes contain annotations so
117+
they are compiled when generating the application cache to improve the overall
118+
performance. Define the list of annotated classes to compile in the
119+
``addAnnotatedClassesToCompile()`` method::
148120

149121
use App\Manager\UserManager;
150122
use App\Utils\Slugger;
@@ -154,16 +126,12 @@ class names::
154126
{
155127
// ...
156128

157-
// this method can't compile classes that contain PHP annotations
158-
$this->addClassesToCompile(array(
159-
UserManager::class,
160-
Slugger::class,
161-
// ...
162-
));
163-
164-
// add here only classes that contain PHP annotations
165129
$this->addAnnotatedClassesToCompile(array(
130+
// you can define the fully qualified class names...
166131
'App\\Controller\\DefaultController',
132+
// ... but glob patterns are also supported:
133+
'**Bundle\\Controller\\',
134+
167135
// ...
168136
));
169137
}
@@ -173,27 +141,6 @@ class names::
173141
If some class extends from other classes, all its parents are automatically
174142
included in the list of classes to compile.
175143

176-
.. versionadded:: 3.2
177-
The option to add classes to compile using patterns was introduced in Symfony 3.2.
178-
179-
The classes to compile can also be added using file path patterns::
180-
181-
// ...
182-
public function load(array $configs, ContainerBuilder $container)
183-
{
184-
// ...
185-
186-
$this->addClassesToCompile(array(
187-
'**Bundle\\Manager\\',
188-
// ...
189-
));
190-
191-
$this->addAnnotatedClassesToCompile(array(
192-
'**Bundle\\Controller\\',
193-
// ...
194-
));
195-
}
196-
197144
Patterns are transformed into the actual class namespaces using the classmap
198145
generated by Composer. Therefore, before using these patterns, you must generate
199146
the full classmap executing the ``dump-autoload`` command of Composer.

0 commit comments

Comments
 (0)