Ver índice de contenidos del libro

6.2. Extensiones Twig

Buena Práctica Define tus extensiones Twig en el directorio AppBundle/Twig/ y configúralas en el archivo app/config/services.yml.

A la aplicación del blog le vendría muy bien un filtro de Twig llamado md2html que transforme el contenido Markdown en contenido HTML.

Antes de crear este filtro, añade como dependencia de tu proyecto la excelente librería Parsedown que transforma el código Markdown en HTML. Para ello, ejecuta el siguiente comando en la consola:

$ composer require erusev/parsedown

Después, define un nuevo servicio llamado markdown para que lo utilice la extensión de Twig. En este caso la definición del servicio es tan simple como indicar la ruta a la clase PHP asociada:

# app/config/services.yml
services:
    # ...
    markdown:
        class: AppBundle\Utils\Markdown

Esta clase Markdown define un único método que transforma el contenido Markdown pasado como argumento en contenido HTML:

namespace AppBundle\Utils;
 
class Markdown
{
    private $parser;
 
    public function __construct()
    {
        $this->parser = new \Parsedown();
    }
 
    public function toHtml($text)
    {
        $html = $this->parser->text($text);
 
        return $html;
    }
}

Ahora ya puedes crear la extensión Twig para definir un nuevo filtro llamado md2html mediante la clase Twig_SimpleFilter. No olvides inyectar el servicio markdown en el constructor de la extensión Twig:

namespace AppBundle\Twig;
 
use AppBundle\Utils\Markdown;
 
class AppExtension extends \Twig_Extension
{
    private $parser;
 
    public function __construct(Markdown $parser)
    {
        $this->parser = $parser;
    }
 
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter(
                'md2html',
                array($this, 'markdownToHtml'),
                array('is_safe' => array('html'))
            ),
        );
    }
 
    public function markdownToHtml($content)
    {
        return $this->parser->toHtml($content);
    }
 
    public function getName()
    {
        return 'app_extension';
    }
}

Para poder utilizar la extensión de Twig en la aplicación, define un nuevo servicio y etiquétalo con la etiqueta twig.extension (el nombre de este servicio es irrelevante porque no lo vas a usar directamente en la aplicación):

# app/config/services.yml
services:
    app.twig.app_extension:
        class:     AppBundle\Twig\AppExtension
        arguments: ["@markdown"]
        tags:
            - { name: twig.extension }