Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call Twig truncate filter inside a controller

Tags:

php

twig

symfony

I need to use twig truncate filter inside a controller. I do not use a Twig template because my controller only return a json object.

From the Twig Text extension source, I saw that the filter function is twig_truncate_filter, so I tried to get the extension as a service and call the filter function it in my controller :

$something = "a long character string that need to be truncated";
$twigText = $this->get("twig.extension.text");
$twig = $this->get("twig");
$truncatedValue = $twigText->twig_truncate_filter($twig,$something)

It give me a Fatal error: Call to undefined method Twig_Extensions_Extension_Text::twig_truncate_filter().

How can I use the filter feature directly in my controller ?

like image 683
Florent Avatar asked Jun 03 '14 12:06

Florent


2 Answers

If you look closely at the Twig/Extensions/Extension/Text file, you'll see that twig_truncate_filter is actually declared as a global function, not part of the Twig_Extensions_Extension_Text class.

That class merely acts as a wrapper for a Twig filter, truncate, to call that global twig_truncate_filter function.

You can simply call it directly in your controller:

$truncatedValue = twig_truncate_filter($twig, $something);
like image 166
duncan Avatar answered Nov 07 '22 19:11

duncan


Probably there is a shorter way, but the following worked for me:

$filters = $this->get('twig.extension.text')->getFilters();
$callable = $filters['truncate']->getCallable();

$truncated = $callable($this->get('twig'), $str));

For Twig Extensions > 1.3 you can use this

$filters = $this->get('twig.extension.text')->getFilters();
$key = array_search('truncate', array_map(function(TwigFilter $filter) { return $filter->getName(); }, $filters), true);
$callable = $filters[$key]->getCallable();
    
$truncated = $callable($this->get('twig'), $str));
like image 10
VisioN Avatar answered Nov 07 '22 21:11

VisioN