Twig – How to create custom extensions or filters

In PHP template engine, Twig there are various inbuilt awesome filters using that anyone can write large apps in less no. of lines like

{% for user in users %}
//write code based on user
{% else %}
//you can add else condition in for array which will work is users is blank
{% endfor %}

and various others filter too but these are limited and various default PHP function are not available in Twig then how can we use those ? For those cases Twig provide ways so that you can add your custom filters/ extension. I am going to show you how.

First  – Create your custom extension class extending class \Twig_Extension 

<?php 
namespace Webkul\DemoBundle\Twig;

class DemoExtension extends \Twig_Extension
{
  //here we will write code
  //two functions are necessary
  // 1st - getFilters() where you declare all your custom extensions
  // 2nd - getName() for your Extension class name
}

It’s basic requirement is to declare two functions getFilters() and getName()  so we add those here. In getFilters() function we declare our all custom filters/ extensions and in getName() function we add this class name (any name).

<?php
namespace Webkul\DemoBundle\Twig;

class DemoExtension extends \Twig_Extension
{
    /**
     * Here we declare our custom filter with their respective function
     */
    public function getFilters()
    {
        return array(
            new \Twig_SimpleFilter('addslashes', array($this, 'addslashes')),
            new \Twig_SimpleFilter('utf8_decode', array($this, 'utf8_decode')),
            new \Twig_SimpleFilter('json_decode', array($this, 'json_decode')),
            new \Twig_SimpleFilter('urldecode', array($this, 'urldecode')),
            //here first urldecode is name which we use in twig and 2nd one is with refer to function written in this class
        );
    }

    /**
     * add slash on string
     */
    public function addslashes($string)
    {
        return addslashes($string);
    }

    /**
     * utf8 decode string
     */
    public function utf8_decode($string) {
        return utf8_decode($string);
    }
    
    /**
     * json decode string
     */
    public function json_decode($string) {
        return json_decode($string);
    }
    
    /**
     * urldecode string
     */
    public function urldecode($string) {
        return urldecode($string);
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'twig_extension';
    }
}

?>

So we created a class with various custom functions now we have to just notify Symfony about these filters/ extensions. We do it after declaring this in our service.

services:
    webkul.twig_extension:
        class: Webkul\DemoBundle\Twig\DemoExtension
        tags:
            - { name: twig.extension }

That’s it our Custom filters/ extensions are ready to use. We can use these like Twig default once.

{{ "Webkul's Awesome Symfony Twig Blog"|addslashes }}

Framework used – Symfony 2.7

. . .

Comment

Add Your Comment

Be the first to comment.

css.php
Hire Us!
Brief us about your requirements and we'll get back to you.
Woo! Hooy!
We have just recieved your project brief and our expert will contact you shortly.
Send Again
Close