Saltar al contenido

Cómo llamar a la función estática en la plantilla Symfony2 Twig

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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