Skip to content

Commit a446761

Browse files
committed
Promoting new bundle directory structure as best practice
1 parent 1839389 commit a446761

File tree

1 file changed

+48
-37
lines changed

1 file changed

+48
-37
lines changed

bundles/best_practices.rst

Lines changed: 48 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -68,30 +68,43 @@ The basic directory structure of an AcmeBlogBundle must read as follows:
6868
.. code-block:: text
6969
7070
<your-bundle>/
71-
├─ AcmeBlogBundle.php
72-
├─ Controller/
73-
├─ README.md
74-
├─ LICENSE
75-
├─ Resources/
76-
│ ├─ config/
77-
│ ├─ doc/
78-
│ │ └─ index.rst
79-
│ ├─ translations/
80-
│ ├─ views/
81-
│ └─ public/
82-
└─ Tests/
71+
├── config/
72+
├── docs/
73+
│ └─ index.rst
74+
├── public/
75+
├── src/
76+
│ ├── Controller/
77+
│ ├── DependencyInjection/
78+
│ └── AcmeBlogBundle.php
79+
├── templates/
80+
├── tests/
81+
├── translations/
82+
├── LICENSE
83+
└── README.md
84+
85+
and the bundle path must be adjusted to the root directory:
86+
87+
.. code-block::
88+
89+
class AcmeBlogBundle extends Bundle
90+
{
91+
public function getPath(): string
92+
{
93+
return \dirname(__DIR__);
94+
}
95+
}
8396
8497
**The following files are mandatory**, because they ensure a structure convention
8598
that automated tools can rely on:
8699

87-
* ``AcmeBlogBundle.php``: This is the class that transforms a plain directory
100+
* ``src/AcmeBlogBundle.php``: This is the class that transforms a plain directory
88101
into a Symfony bundle (change this to your bundle's name);
89102
* ``README.md``: This file contains the basic description of the bundle and it
90103
usually shows some basic examples and links to its full documentation (it
91104
can use any of the markup formats supported by GitHub, such as ``README.rst``);
92105
* ``LICENSE``: The full contents of the license used by the code. Most third-party
93106
bundles are published under the MIT license, but you can `choose any license`_;
94-
* ``Resources/doc/index.rst``: The root file for the Bundle documentation.
107+
* ``docs/index.rst``: The root file for the Bundle documentation.
95108

96109
The depth of subdirectories should be kept to a minimum for the most used
97110
classes and files. Two levels is the maximum.
@@ -107,27 +120,27 @@ and others are just conventions followed by most developers):
107120
=================================================== ========================================
108121
Type Directory
109122
=================================================== ========================================
110-
Commands ``Command/``
111-
Controllers ``Controller/``
112-
Service Container Extensions ``DependencyInjection/``
113-
Doctrine ORM entities (when not using annotations) ``Entity/``
114-
Doctrine ODM documents (when not using annotations) ``Document/``
115-
Event Listeners ``EventListener/``
116-
Configuration (routes, services, etc.) ``Resources/config/``
117-
Web Assets (CSS, JS, images) ``Resources/public/``
118-
Translation files ``Resources/translations/``
119-
Validation (when not using annotations) ``Resources/config/validation/``
120-
Serialization (when not using annotations) ``Resources/config/serialization/``
121-
Templates ``Resources/views/``
122-
Unit and Functional Tests ``Tests/``
123+
Commands ``src/Command/``
124+
Controllers ``src/Controller/``
125+
Service Container Extensions ``src/DependencyInjection/``
126+
Doctrine ORM entities (when not using annotations) ``src/Entity/``
127+
Doctrine ODM documents (when not using annotations) ``src/Document/``
128+
Event Listeners ``src/EventListener/``
129+
Configuration (routes, services, etc.) ``config/``
130+
Web Assets (CSS, JS, images) ``public/``
131+
Translation files ``translations/``
132+
Validation (when not using annotations) ``config/validation/``
133+
Serialization (when not using annotations) ``config/serialization/``
134+
Templates ``templates/``
135+
Unit and Functional Tests ``tests/``
123136
=================================================== ========================================
124137

125138
Classes
126139
-------
127140

128141
The bundle directory structure is used as the namespace hierarchy. For
129142
instance, a ``ContentController`` controller which is stored in
130-
``Acme/BlogBundle/Controller/ContentController.php`` would have the fully
143+
``Acme/BlogBundle/src/Controller/ContentController.php`` would have the fully
131144
qualified class name of ``Acme\BlogBundle\Controller\ContentController``.
132145

133146
All classes and files must follow the :doc:`Symfony coding standards </contributing/code/standards>`.
@@ -153,7 +166,7 @@ Tests
153166
-----
154167

155168
A bundle should come with a test suite written with PHPUnit and stored under
156-
the ``Tests/`` directory. Tests should follow the following principles:
169+
the ``tests/`` directory. Tests should follow the following principles:
157170

158171
* The test suite must be executable with a simple ``phpunit`` command run from
159172
a sample application;
@@ -240,10 +253,10 @@ Documentation
240253

241254
All classes and functions must come with full PHPDoc.
242255

243-
Extensive documentation should also be provided in the ``Resources/doc/``
256+
Extensive documentation should also be provided in the ``docs/``
244257
directory.
245-
The index file (for example ``Resources/doc/index.rst`` or
246-
``Resources/doc/index.md``) is the only mandatory file and must be the entry
258+
The index file (for example ``docs/index.rst`` or
259+
``docs/index.md``) is the only mandatory file and must be the entry
247260
point for the documentation. The
248261
:doc:`reStructuredText (rST) </contributing/documentation/format>` is the format
249262
used to render the documentation on the Symfony website.
@@ -480,9 +493,7 @@ The ``composer.json`` file should include at least the following metadata:
480493
This information is used by Symfony to load the classes of the bundle. It's
481494
recommended to use the `PSR-4`_ autoload standard: use the namespace as key,
482495
and the location of the bundle's main class (relative to ``composer.json``)
483-
as value. For example, if the main class is located in the bundle root
484-
directory: ``"autoload": { "psr-4": { "SomeVendor\\BlogBundle\\": "" } }``.
485-
If the main class is located in the ``src/`` directory of the bundle:
496+
as value. As the main class is located in the ``src/`` directory of the bundle:
486497
``"autoload": { "psr-4": { "SomeVendor\\BlogBundle\\": "src/" } }``.
487498

488499
In order to make it easier for developers to find your bundle, register it on
@@ -493,14 +504,14 @@ Resources
493504

494505
If the bundle references any resources (config files, translation files, etc.),
495506
don't use physical paths (e.g. ``__DIR__/config/services.xml``) but logical
496-
paths (e.g. ``@FooBundle/Resources/config/services.xml``).
507+
paths (e.g. ``@FooBundle/config/services.xml``).
497508

498509
The logical paths are required because of the bundle overriding mechanism that
499510
lets you override any resource/file of any bundle. See :ref:`http-kernel-resource-locator`
500511
for more details about transforming physical paths into logical paths.
501512

502513
Beware that templates use a simplified version of the logical path shown above.
503-
For example, an ``index.html.twig`` template located in the ``Resources/views/Default/``
514+
For example, an ``index.html.twig`` template located in the ``templates/Default/``
504515
directory of the FooBundle, is referenced as ``@Foo/Default/index.html.twig``.
505516

506517
Learn more

0 commit comments

Comments
 (0)