Hoy vamos a ver como crear extensiones de Twig en Symfony3.
Una extensión de Twig no es más que un helper para nuestras vistas, nos va a permitir tener una funcionalidad que va a permitir ser utilizada en cualquier vista twig de nuestro proyecto de Symfony.
Para crear extensiones de Twig lo primero que tenemos que hacer es crear un directorio llamado Twig dentro de nuestro Bundle. Y dentro creamos una clase PHP, por ejemplo yo crearé el fichero GetUserExtension.php que contendrá una clase del mismo nombre que extenderá al objeto Twig_Extension.
<?php namespace AppBundle\Twig; use Symfony\Bridge\Doctrine\RegistryInterface; class GetUserExtension extends \Twig_Extension { // Cargamos doctrine dentro del servicio/extensión protected $doctrine; public function __construct(RegistryInterface $doctrine) { $this->doctrine = $doctrine; } /* Le ponemos el nombre al filtro que finalmente usaremos en la vista y le indicamos que metodo va a cargar.*/ public function getFilters() { return array( new \Twig_SimpleFilter('get_user', array($this, 'getUserFilter')), ); } // Método con la funcionalidad de la extensión public function getUserFilter($user_id) { $user_repo = $this->doctrine->getRepository("BackendBundle:User"); $user= $user_repo->findOneBy(array("id" => $user_id)); if(!empty($user) && is_object($user)){ $result = $user; }else{ $result = false; } return $result; } public function getName() { return 'get_user_extension'; } }
Esta extensión, helper o filtro nos permitirá conseguir los datos de un usuario dado su id en el caso de que exista.
Para poder utilizar esta extensión en nuestras vistas tenemos que añadirla como servicio en nuestro services.yml, en este caso le paso doctrine al servicio porque también lo estamos utilizando en la clase de la extensión de Twig.
services: get_user.twig_extension: class: AppBundle\Twig\GetUserExtension public: false arguments: doctrine: "@doctrine" tags: - { name: twig.extension }
Ahora ya podemos usar la extensión, en mi caso guardo el usuario en una variable.
{% set usuario = myuser.id|get_user %}
Con esto ya sabemos crear extensiones de Twig en Symfony3.