Buenas prácticas oficiales de Symfony

2.4. Los bundles de la aplicación

Cuando se publicó Symfony 2.0 por primera vez, la respuesta natural de los programadores fue seguir estructurando sus aplicaciones como si se tratara de la antigua versión symfony 1.x. Así que muchas aplicaciones Symfony acabaron divididas en módulos lógicos, similares a los de symfony 1.x.

Por eso hoy en día es habitual encontrarse con aplicaciones Symfony2 que definen bundles como los siguientes: UserBundle, ProductBundle, InvoiceBundle, etc.

No obstante, los bundles están pensados para que sean elementos de software que se pueden reutilizar de manera autónoma. En otras palabras, si tienes por ejemplo un bundle llamado UserBundle pero que no puedes reutilizarlo tal y como está en otras aplicaciones Symfony2, entonces ese bundle está mal hecho. Lo mismo que si tu bundle InvoiceBundle depende de otro bundle como ProductBundle. Se trata de un error y estos dos elementos no deberían ser bundles independientes.

Buena Práctica Crea solamente un bundle llamado AppBundle en tu aplicación.

Al tener un único bundle llamdo AppBundle, el código de tus aplicaciones será mucho más fácil de escribir y de leer. Además, a partir de la versión 2.6, la documentación oficial de Symfony siempre mostrará sus ejemplos con este bundle AppBundle.

Nota No es necesario añadir ningún prefijo al nombre AppBundle para indicar el vendor, como por ejemplo el nombre de tu empresa o proyecto: AcmeAppBundle. El motivo es que este bundle, por su propia naturaleza, nunca va a ser reutilizado en otras aplicaciones y nunca va a ser publicado como bundle de terceros.

Con todo esto, la estructura de directorios recomendada para una aplicación Symfony que siga las buenas prácticas oficiales debería ser la siguiente:

blog/
├─ app/
│  ├─ console
│  ├─ cache/
│  ├─ config/
│  └─ logs/
│  └─ Resources/
├─ src/
│  └─ AppBundle/
├─ vendor/
└─ web/
   ├─ app.php
   └─ app_dev.php

Truco Si utilizas Symfony 2.6 o superior, este bundle AppBundle ya está generado, por lo que no tienes que hacer nada más. Si utilizas una versión anterior de Symfony, puedes generar el bundle ejecutando el siguiente comando:

$ php app/console generate:bundle --namespace=AppBundle --dir=src --format=annotation --no-interaction