Crear extensiones de Twig en Symfony 3

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.

Víctor Robles WEB

Autor: Victor

Desarrollador web - Formador online - Blogger

Compartir este post

Poner un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *