Skip to content

Commit 88e3ef5

Browse files
committed
feature #8613 Updated the main bundles article for Symfony 4 (javiereguiluz)
This PR was squashed before being merged into the master branch (closes #8613). Discussion ---------- Updated the main bundles article for Symfony 4 I've removed the `Bundle Directory Structure` contents ... but I plan to move them to other bundle articles in a separate PR. Commits ------- 04fde8c Updated the main bundles article for Symfony 4
2 parents 66bb046 + 04fde8c commit 88e3ef5

File tree

2 files changed

+43
-171
lines changed

2 files changed

+43
-171
lines changed

bundles.rst

+37-167
Original file line numberDiff line numberDiff line change
@@ -6,179 +6,49 @@
66
The Bundle System
77
=================
88

9-
A bundle is similar to a plugin in other software, but even better. The key
10-
difference is that *everything* is a bundle in Symfony, including both the
11-
core framework functionality and the code written for your application.
12-
Bundles are first-class citizens in Symfony. This gives you the flexibility
13-
to use pre-built features packaged in `third-party bundles`_ or to distribute
14-
your own bundles. It makes it easy to pick and choose which features to enable
15-
in your application and to optimize them the way you want.
16-
17-
.. note::
18-
19-
While you'll learn the basics here, an entire article is devoted to the
20-
organization and best practices of :doc:`bundles </bundles/best_practices>`.
21-
22-
A bundle is simply a structured set of files within a directory that implement
23-
a single feature. You might create a BlogBundle, a ForumBundle or
24-
a bundle for user management (many of these exist already as open source
25-
bundles). Each directory contains everything related to that feature, including
26-
PHP files, templates, stylesheets, JavaScript files, tests and anything else.
27-
Every aspect of a feature exists in a bundle and every feature lives in a
28-
bundle.
29-
30-
Bundles used in your applications must be enabled by registering them in
31-
the ``registerBundles()`` method of the ``AppKernel`` class::
32-
33-
// app/AppKernel.php
34-
public function registerBundles()
35-
{
36-
$bundles = array(
37-
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
38-
new Symfony\Bundle\SecurityBundle\SecurityBundle(),
39-
new Symfony\Bundle\TwigBundle\TwigBundle(),
40-
new Symfony\Bundle\MonologBundle\MonologBundle(),
41-
new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
42-
new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
43-
new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
44-
new AppBundle\AppBundle(),
45-
);
46-
47-
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
48-
$bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
49-
$bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
50-
$bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
51-
}
52-
53-
return $bundles;
54-
}
55-
56-
With the ``registerBundles()`` method, you have total control over which bundles
57-
are used by your application (including the core Symfony bundles).
9+
.. caution::
10+
11+
In Symfony versions prior to 4.0, it was recommended to organize your own
12+
application code using bundles. This is no longer recommended and bundles
13+
should only be used to share code and features between multiple applications.
14+
15+
A bundle is similar to a plugin in other software, but even better. The core
16+
features of Symfony framework are implemented with bundles (FrameworkBundle,
17+
SecurityBundle, DebugBundle, etc.) They are also used to add new features in
18+
your application via `third-party bundles`_.
19+
20+
Bundles used in your applications must be enabled per
21+
:doc:`environment </configuration/environments>` in the ``config/bundles.php``
22+
file::
23+
24+
// config/bundles.php
25+
return [
26+
// 'all' means that the bundle is enabled for any Symfony environment
27+
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
28+
Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
29+
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
30+
Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
31+
Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true],
32+
Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
33+
Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
34+
// this bundle is enabled only in 'dev' and 'test', so you can't use it in 'prod'
35+
Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
36+
];
5837

5938
.. tip::
6039

61-
A bundle can live *anywhere* as long as it can be autoloaded (via the
62-
autoloader configured at ``app/autoload.php``).
63-
64-
Creating a Bundle
65-
-----------------
66-
67-
The Symfony Standard Edition comes with a handy task that creates a fully-functional
68-
bundle for you. Of course, creating a bundle by hand is pretty easy as well.
69-
70-
To show you how simple the bundle system is, create a new bundle called
71-
AcmeTestBundle and enable it.
72-
73-
.. tip::
74-
75-
The ``Acme`` portion is just a dummy name that should be replaced by
76-
some "vendor" name that represents you or your organization (e.g.
77-
ABCTestBundle for some company named ``ABC``).
78-
79-
Start by creating a ``src/Acme/TestBundle/`` directory and adding a new file
80-
called ``AcmeTestBundle.php``::
81-
82-
// src/Acme/TestBundle/AcmeTestBundle.php
83-
namespace Acme\TestBundle;
84-
85-
use Symfony\Component\HttpKernel\Bundle\Bundle;
86-
87-
class AcmeTestBundle extends Bundle
88-
{
89-
}
90-
91-
.. tip::
92-
93-
The name AcmeTestBundle follows the standard
94-
:ref:`Bundle naming conventions <bundles-naming-conventions>`. You could
95-
also choose to shorten the name of the bundle to simply TestBundle by naming
96-
this class TestBundle (and naming the file ``TestBundle.php``).
97-
98-
This empty class is the only piece you need to create the new bundle. Though
99-
commonly empty, this class is powerful and can be used to customize the behavior
100-
of the bundle.
101-
102-
Now that you've created the bundle, enable it via the ``AppKernel`` class::
103-
104-
// app/AppKernel.php
105-
public function registerBundles()
106-
{
107-
$bundles = array(
108-
// ...
109-
110-
// register your bundle
111-
new Acme\TestBundle\AcmeTestBundle(),
112-
);
113-
// ...
114-
115-
return $bundles;
116-
}
117-
118-
And while it doesn't do anything yet, AcmeTestBundle is now ready to be used.
119-
120-
And as easy as this is, Symfony also provides a command-line interface for
121-
generating a basic bundle skeleton:
122-
123-
.. code-block:: terminal
124-
125-
$ php bin/console generate:bundle --namespace=Acme/TestBundle
126-
127-
The bundle skeleton generates a basic controller, template and routing
128-
resource that can be customized. You'll learn more about Symfony's command-line
129-
tools later.
130-
131-
.. tip::
132-
133-
Whenever creating a new bundle or using a third-party bundle, always make
134-
sure the bundle has been enabled in ``registerBundles()``. When using
135-
the ``generate:bundle`` command, this is done for you.
136-
137-
Bundle Directory Structure
138-
--------------------------
139-
140-
The directory structure of a bundle is simple and flexible. By default, the
141-
bundle system follows a set of conventions that help to keep code consistent
142-
between all Symfony bundles. Take a look at AcmeDemoBundle, as it contains some
143-
of the most common elements of a bundle:
144-
145-
``Controller/``
146-
Contains the controllers of the bundle (e.g. ``RandomController.php``).
147-
148-
``DependencyInjection/``
149-
Holds certain Dependency Injection Extension classes, which may import service
150-
configuration, register compiler passes or more (this directory is not
151-
necessary).
152-
153-
``Resources/config/``
154-
Houses configuration, including routing configuration (e.g. ``routes.yaml``).
155-
156-
``Resources/views/``
157-
Holds templates organized by controller name (e.g. ``Random/index.html.twig``).
158-
159-
``Resources/public/``
160-
Contains web assets (images, stylesheets, etc) and is copied or symbolically
161-
linked into the project ``public/`` directory via the ``assets:install`` console
162-
command.
163-
164-
``Tests/``
165-
Holds all tests for the bundle.
166-
167-
A bundle can be as small or large as the feature it implements. It contains
168-
only the files you need and nothing else.
169-
170-
As you move through the guides, you'll learn how to persist objects to a
171-
database, create and validate forms, create translations for your application,
172-
write tests and much more. Each of these has their own place and role within
173-
the bundle.
40+
In a default Symfony application that uses :doc:`Symfony Flex </setup/flex>`,
41+
bundles are enabled/disabled automatically for you when installing/removing
42+
them, so you don't need to look at or edit this ``bundles.php`` file.
17443

17544
Learn more
17645
----------
17746

178-
.. toctree::
179-
:maxdepth: 1
180-
:glob:
181-
182-
bundles/*
47+
* :doc:`/bundles/remove`
48+
* :doc:`/bundles/override`
49+
* :doc:`/bundles/best_practices`
50+
* :doc:`/bundles/configuration`
51+
* :doc:`/bundles/extension`
52+
* :doc:`/bundles/prepend_extension`
18353

18454
.. _`third-party bundles`: https://github.com/search?q=topic%3Asymfony-bundle&type=Repositories

bundles/index.rst

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1+
:orphan:
2+
13
Bundles
24
=======
35

46
.. toctree::
57
:maxdepth: 2
68

79
installation
8-
best_practices
9-
inheritance
10-
override
1110
remove
12-
extension
11+
override
12+
inheritance
13+
best_practices
1314
configuration
15+
extension
1416
prepend_extension

0 commit comments

Comments
 (0)