bundles en symfony 3

Los bundles en symfony 3 son lo que en otros frameworks se llaman plugins, es decir es el general código para reutilizar en diferentes aplicaciones.

Desde la versión 3.4 de Symfony se recomienda que se utilice un único bundle para la aplicación.

Por lo que no debemos organizar nuestra aplicación utilizando este sistema. A no ser que queramos compartir ese código entre varias aplicaciones.

Una vez aclarado esto vamos a ver como está compuesto un bundle, para ello nos vamos a la carpeta src y vemos un directorio llamado AppBundle que es el principal de nuestra aplicación.

Si entramos dentro veremos que hay un archivo llamado AppBundle.php que tiene el siguiente contenido:

namespace AppBundle
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AppBundle extends Bundle
{
}

Este está listo para que empecemos a trabajar, pero tomando de ejemplo el de la documentación oficial:

// app/AppKernel.php
public function registerBundles()
{
    $bundles = [
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        new Symfony\Bundle\MonologBundle\MonologBundle(),
        new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
        new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
        new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
        new AppBundle\AppBundle(),
    ];

    if (in_array($this->getEnvironment(), ['dev', 'test'])) {
        $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
        $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
    }

    return $bundles;
}

Veremos que los bundles en symfony 3 no son más que una serie de acciones en unos controladores que permiten definir todo lo que haremos en nuestra aplicación, urls, lectura de BBDD, mandar mails…

Crear un Bundle en symfony 3

Aunque ya hemos dicho que las aplicaciones deberían de tener un solo bundle a partir de symfony 3.4 puede darse el caso de que necesitemos usar alguno, para crearlos tenemos dos opciones; manual o de forma automática.

Forma manual

Para hacerlo de forma manual se tiene que poner el siguiente código (el mismo que tenemos arriba en nuestro bundle original en limpio):

namespace AppBundle
use Symfony\Component\HttpKernel\Bundle\Bundle;
class AppBundle extends Bundle
{
}

Forma automática

Usando el siguiente wizard desde el directorio raíz de nuestra aplicación (ten en cuenta que nuestro bundle siempre tiene que terminar con la palabra Bundle):

php bin/console generate:bundle

El cual nos hará una serie de preguntas para configurar perfectamente todo nuestro bundle, generando todo el código pero al terminar de hacerlo nos dirá que hay que editar en archivo composer.json

Entonces debemos irnos a nuestro composer.json y añadir la siguiente línea:

Y ejecutamos el siguiente comando:

composer dump-autoload

Y nuestro bundle estará instalado y estaría listo para que trabajasemos con él.

No obstante vuelvo a insistir hay que evitar trabajar con bundles desde 3.4, tan solo con el que tenemos generado a partir del template inicial.