[英]How to Call Static Function In Symfony2 Twig Template
如何在不通過控制器的情況下在樹枝模板中調用我的靜態函數?
例如:
...
{{ MyStaticClass::getData() }}
...
我的靜態類:
class MyStaticClass {
const v1 = 'Value1';
const v2 = 'Value2';
...
public static function getData() {
...
return $data;
}
}
有時不編寫 Twig 擴展,一個更簡單/不那么臃腫的解決方案可以是簡單地將帶有靜態方法的類的新實例傳遞給 twig。
例如
// ...
$viewVars['MyStaticClass'] = new MyStaticClass();
// ...
$html = $twig->render('myTemplate.html.twig', $viewVars);
在樹枝上:
{{ MyStaticClass.getData() }}
您不能在樹枝模板中直接調用 PHP。 您需要創建一個過濾器或函數來執行您要查找的操作。
$twig = new Twig_Environment($loader, $params);
$twigFunction = new Twig_SimpleFunction('MyStaticClass', function($method) {
MyStaticClass::$method
});
$twig->addFunction($twigFunction);
然后在您的樹枝模板中執行以下操作:
{{ MyStaticClass('getData') }}
當然,上面的例子假設MyStaticClass
在你所在的任何地方的范圍內。
Symfony 示例
您必須創建樹枝擴展。 下面的例子:
namespace PurpleNeve\Web\PNWebBundle\Extensions;
use PurpleNeve\Web\PNWebBundle\DependencyInjection\CurrencyConverter;
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 "?";
}
}
}
這是我創建的一個擴展示例,用於在 twig 中將貨幣從一種貨幣轉換為另一種貨幣。
要實現它,您需要在 services.yml 中為其創建一個服務對象
parameters:
currency_converter.class: PurpleNeve\Web\PNWebBundle\DependencyInjection\CurrencyConverter
services:
currency_converter:
class: "%currency_converter.class%"
arguments : [@doctrine.orm.entity_manager]
twig.extension.currency:
class: PurpleNeve\Web\PNWebBundle\Extensions\TwigCurrency
tags:
- { name: 'twig.extension' }
arguments : [ @currency_converter ]
然后如上所述,在樹枝中我可以使用{{ convertCurrency(55505, 'CAD', 'USD) }}
一個通用的方法是注冊一個名為callstatic
的 Twig 輔助函數來進行調用。
$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);
}));
這種方法的主要優點是它適用於任何類和方法組合。
用法:
{# This will call \Mynamespace\Mypackage\Myclass::getStuff(); #}
{% set result = callstatic('\\Mynamespace\\Mypackage\\Myclass', 'getStuff') %}
它還支持參數:
{# This will call \Mynamespace\Mypackage\Myclass::getStuff('arg1', 'arg2'); #}
{% set result = callstatic('\\Mynamespace\\Mypackage\\Myclass', 'getStuff', 'arg1', 'arg2') %}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.