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 }