Nuevo en Symfony 2.8: usando Symfony como un microframework

El término microframework se utiliza habitualmente para referirse a "frameworks minimalistas para desarrollar aplicaciones web". La mayoría de programadores asocia los microframeworks a algo "pequeño y rápido", como por ejemplo Silex. No obstante, a nosotros nos gusta más definir un microframework como un "framework sencillo en el que las decisiones sobre la arquitectura de la aplicación las tomas tu".

Gracias a la flexibilidad de su arquitectura interna, Symfony se ha podido usar como microframework desde que se publicó en 2011. No obstante, muy pocos programadores lo utilizan así porque hasta ahora no era muy cómodo hacerlo.

Por ese motivo, Symfony 2.8 incluye un trait de PHP diseñado para crear microkernels. Gracias a este "trait", puedes crear aplicaciones Symfony muy pequeñas, incluso en un solo archivo. Por ejemplo, este es el código completo para hacer una aplicación "Hola Mundo" con Symfony utilizado como microframework:

// app/MicroKernel.php
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\Routing\RouteCollectionBuilder;
 
class MicroKernel extends Kernel
{
    use MicroKernelTrait;
 
    public function registerBundles()
    {
        return array(new Symfony\Bundle\FrameworkBundle\FrameworkBundle());
    }
 
    protected function configureRoutes(RouteCollectionBuilder $routes)
    {
        $routes->add('/', 'kernel:indexAction', 'index');
    }
 
    protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
    {
        $c->loadFromExtension('framework', ['secret' => '12345']);
    }
 
    public function indexAction()
    {
        return new Response('Hello World');
    }
}

La clase MicroKernel se encarga de registrar los bundles, configurarlos, definir las rutas de la aplicación e incluso contiene el código de los controladores. Todo en un solo archivo pequeño. De hecho, si no cuentas las líneas de código obligatorias por PHP (las instrucciones use y las declaraciones de las funciones) este ejemplo tiene exactamente cuatro líneas de código PHP. Piensa un momento en lo que acabas de leer: una aplicación Symfony completa y funcional en tan solo cuatro líneas de código.

Como puedes imaginar, al usar Symfony como microframework el rendimiento de la aplicación mejora significativamente, ya que solo están activados los bundles y las funcionalidades que tu quieres. En este ejemplo sencillo, la mejora es 3x en rendimiento de CPU y 2x en reducción de la memoria consumida (comparándolo con una aplicación creada con la edición estándar de Symfony):

Symfony Microframework vs Symfony Standard Edition

La gran ventaja de desarrollar una aplicación con el microframework Symfony es precisamente que por debajo de la aplicación se está ejecutando el framework Symfony. Esto significa que no sufrirás las típicas limitaciones de los microframeworks tradicionales. A medida que tu aplicación crezca podrás ir activando las funcionalidades de Symfony que necesites y también podrás usar cualquiera de sus miles de bundles.

El siguiente ejemplo muestra cómo ampliar la aplicación "Hola Mundo" anterior para activar el soporte para plantillas Twig, la barra de depuración web y el profiler de Symfony. De nuevo el resultado es una aplicación Symfony en un único archivo con unas pocas líneas de código PHP:

// app/MicroKernel.php
 
class MicroKernel extends Kernel
{
    use MicroKernelTrait;
 
    public function registerBundles()
    {
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
        );
 
        if (in_array($this->getEnvironment(), array('dev', 'test'), true)) {
            $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
        }
 
        return $bundles;
    }
 
    protected function configureRoutes(RouteCollectionBuilder $routes)
    {
        $routes->mount('/_wdt', $routes->import('@WebProfilerBundle/Resources/config/routing/wdt.xml'));
        $routes->mount('/_profiler', $routes->import('@WebProfilerBundle/Resources/config/routing/profiler.xml'));
 
        $routes->add('/', 'kernel:indexAction', 'index');
    }
 
    protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
    {
        // configurar los bundles
        $c->loadFromExtension('framework', [
            'secret' => '12345',
            'profiler' => null,
            'templating' => ['engines' => ['twig']],
        ]);
 
        $c->loadFromExtension('web_profiler', ['toolbar' => true]);
 
        // añadir parámetros de configuración
        $c->setParameter('mail_sender', '[email protected]');
 
        // registrar servicios
        $c->register('app.markdown', 'AppBundle\\Service\\Parser\\Markdown');
    }
 
    public function indexAction()
    {
        return $this->container->get('templating')->renderResponse('index.html.twig');
    }
}

En cualquier caso, el principal objetivo del microkernel no es crear aplicaciones en un único archivo. El caso de uso que creemos que será más útil es la creación de aplicaciones Symfony más pequeñas. El siguiente ejemplo muestra todo el código que necesitas para crear una aplicación Symfony que utiliza un archivo services.yml, un archivo config.yml para cada entorno y que define los controladores en el típico bundle AppBundle:

// app/MicroKernel.php
 
// ...
 
class MicroKernel extends Kernel
{
    use MicroKernelTrait;
 
    public function registerBundles()
    {
        return array(
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new AppBundle\AppBundle(),
        );
    }
 
    protected function configureRoutes(RouteCollectionBuilder $routes)
    {
        $routes->mount('/', $routes->import('@AppBundle/Controller', 'annotation'));
    }
 
    protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader)
    {
        $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
        $loader->load(__DIR__.'/config/services.yml');
    }
}

No olvides cambiar AppKernel por MicroKernel en el controlador frontal de la aplicación:

// web/app.php
use Symfony\Component\HttpFoundation\Request;
 
$loader = require __DIR__.'/../app/autoload.php';
require_once __DIR__.'/../app/MicroKernel.php';
 
$app = new MicroKernel('prod', false);
$app->loadClassCache();
 
$app->handle(Request::createFromGlobals())->send();

Si alguna vez te has preguntado si sería mejor usar un microframework o un framework completo para desarrollar una aplicación, ahora tienes otra alternativa. Gracias al uso de Symfony como microframework, puedes tener ambos a la vez y en una misma aplicación. Además, ya no tendrás que renunciar a ninguna funcionalidad avanzada de las que carecen los microframeworks tradicionales.

Fuente: New in Symfony 2.8: Symfony as a Microframework

Comentarios

  1. Hola Javier,

    Excelente articulo y excelente manera de usar Symfony, una de las limitaciones que he tenido al usar Silex es que algunas librerias no están disponibles pero si existen bundles para Symfony de esas librerias.

    Seria muy bueno si existiera algún repo con un "esqueleto" usando este microframework.

    Con esto me surge una duda, al final silex no seria una alternativa menos opcionada? Es decir, ya pudiendo usar Symfony como un microframework y con esto todas las ventajas de Symfony, Silex seria menos necesario.

    Gracias.

    Ramiro Anacona Meneses el 19 de noviembre de 2015, 15:05:37

  2. Me uno a la duda de Ramiro...

    Gran artículo Javier. Gracias.

    Ignacio Giménez el 19 de noviembre de 2015, 21:42:15

  3. No he podido editar mi comentario anterior, pero más bien la duda esta en: hasta que punto sigue siendo necesario "mantener" Silex, que ya de por sí está basado en Symfony, teniendo la posibilidad de usar el microkernel...

    Ignacio Giménez el 19 de noviembre de 2015, 21:47:27

  4. La madre que os pario. Es cojonudo. Genial. Sublime. Tengo que trastear con el.

    Carlos Gude el 21 de noviembre de 2015, 13:09:17

  5. En el blog oficial de Symfony, el propio Fabien ha añadido este comentario en el que dice que "Silex y el microkernel de Symfony no tienen nada que ver".

    Mi opinión personal es bastante diferente: gracias a estos cambios ya no usaré Silex en ninguna aplicación. Con Symfony puedo obtener el mismo rendimiento y el mismo tamaño diminuto de la aplicación que en Silex ... pero sabiendo que si la aplicación crece podré usar todo el potencial de Symfony.

    Javier Eguiluz el 22 de noviembre de 2015, 21:59:50

  6. Hola Javier, quisiera me indicaras cual es la forma adecuada de instalar Symfony 2.8 y 3.0 para realizar pruebas: clonar el repositorio? (en tal caso cual/es rama/s ?? ), usar el instalador de Symfony? (creo que aun el 3.0 no esta soportado pero no tengo la menor idea sobre el 2.8 y tampoco se el tag que debo usar)

    Reynier Perez Mira el 23 de noviembre de 2015, 4:02:44

  7. Estoy de acuerdo contigo, que bueno que alguien como tu opine eso, de esta manera podremos usar con mas confianza este microframework.

    Hay un repo en github.com con un "skeleton" https://github.com/CawaKharkov/symfony-micro

    Yo mismo he contribuido algo :)

    Ramiro Anacona Meneses el 23 de noviembre de 2015, 4:33:00

  8. Para instalar Symfony 2.8: symfony new mi_proyecto 2.8.0-BETA1 y para 3.0, es mejor usar composer create-project symfony/framework-standard-edition dev-master

    Javier Eguiluz el 23 de noviembre de 2015, 15:40:05

  9. Buenas Javier, enhorabuena esto es una grandisima noticia. Pero me surge una duda, entonces cualquier versión a partir de las 2.8 y también la recién salida 3.0 pueden ser utilizado como micro framework, haciendo uso del microkernel?

    abrazos!!

    Jose Carlos Campos el 1 de diciembre de 2015, 12:04:32

  10. Jose, efectivamente todas las versiones desde la 2.8.0 en adelante incluyen el microkernel para crear este tipo de aplicaciones.

    Javier Eguiluz el 1 de diciembre de 2015, 22:32:46

Este artículo ya no permite añadir más comentarios.
¿Por qué? Los artículos cierran sus comentarios automáticamente unos meses después de su publicación para asegurar que estos sigan siendo relevantes.

Publicada el

19 de noviembre de 2015

Etiquetas

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.