Nuestros mejores desarrolladores han agotado sus reservas de café, buscando a tiempo completo por la solución, hasta que Lila halló el arreglo en Gogs así que hoy la comparte contigo.
Solución:
En lugar de escribir una extensión Twig, una solución más fácil/menos inflada a veces puede ser simplemente pasar una nueva instancia de la clase con el static métodos para ramita.
p.ej
// ...
$viewVars['MyStaticClass'] = new MyStaticClass();
// ...
$html = $twig->render('myTemplate.html.twig', $viewVars);
y en ramita:
MyStaticClass.getData()
No puede llamar directamente a PHP en una plantilla twig. Deberá crear un filtro o función para hacer lo que está buscando.
$twig = new Twig_Environment($loader, $params);
$twigFunction = new Twig_SimpleFunction('MyStaticClass', function($method)
MyStaticClass::$method
);
$twig->addFunction($twigFunction);
Luego, en su plantilla twig simplemente haga:
MyStaticClass('getData')
Por supuesto, el ejemplo anterior asume MyStaticClass
está dentro del alcance de donde sea que estés twig.
Ejemplo de Symfony
Debes crear una ramita de extensiones. Ejemplo a continuación:
namespace PurpleNeveWebPNWebBundleExtensions;
use PurpleNeveWebPNWebBundleDependencyInjectionCurrencyConverter;
class TwigCurrency extends Twig_Extension
private $converter;
public function __construct(CurrencyConverter $converter)
$this->converter = $converter;
public function getName()
return 'currency';
public function getFilters()
return array(
'convertCurrency' => new Twig_Filter_Method($this, 'getConversionBetween')
);
public function getConversionBetween($amount, $isoFrom, $isoTo="USD")
try
$value = $this->converter->convertAmount($amount, $isoFrom, $isoTo);
return round($value,2);
catch(Exception $e)
return "?";
Este es un ejemplo de una extensión que creé para convertir moneda de una moneda a otra en twig.
Para implementarlo, debe crear un objeto de servicio para él en su services.yml
parameters:
currency_converter.class: PurpleNeveWebPNWebBundleDependencyInjectionCurrencyConverter
services:
currency_converter:
class: "%currency_converter.class%"
arguments : [@doctrine.orm.entity_manager]
twig.extension.currency:
class: PurpleNeveWebPNWebBundleExtensionsTwigCurrency
tags:
- name: 'twig.extension'
arguments : [ @currency_converter ]
Luego, como arriba, dentro de twig puedo llamar a esa clase y función usando convertCurrency(55505, 'CAD', 'USD)
Un enfoque genérico es registrar una función auxiliar de Twig llamada callstatic
para hacer la llamada.
$twig->addFunction(new Twig_SimpleFunction('callstatic', function ($class, $method, ...$args)
if (!class_exists($class))
throw new Exception("Cannot call static method $method on Class $class: Invalid Class");
if (!method_exists($class, $method))
throw new Exception("Cannot call static method $method on Class $class: Invalid method");
return forward_static_call_array([$class, $method], $args);
));
La principal ventaja de este enfoque es que funcionará con cualquier combinación de clase y método.
Uso:
# This will call MynamespaceMypackageMyclass::getStuff(); #
% set result = callstatic('\Mynamespace\Mypackage\Myclass', 'getStuff') %
También admite argumentos:
# This will call MynamespaceMypackageMyclass::getStuff('arg1', 'arg2'); #
% set result = callstatic('\Mynamespace\Mypackage\Myclass', 'getStuff', 'arg1', 'arg2') %
Reseñas y valoraciones del artículo
Más adelante puedes encontrar las críticas de otros administradores, tú asimismo tienes la libertad de dejar el tuyo si lo crees conveniente.