如何调用我的静态函数在树枝模板不通过控制器?
例如:
...
{{ MyStaticClass::getData() }}
...
My Static Class:
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);
and in twig:
{{ MyStaticClass.getData() }}
你不能在一个小模板中直接调用PHP。你需要创建一个过滤器或函数来做你想做的事情。
$twig = new Twig_Environment($loader, $params);
$twigFunction = new Twig_SimpleFunction('MyStaticClass', function($method) {
MyStaticClass::$method
});
$twig->addFunction($twigFunction);
然后在你的小树枝模板中做:
{{ MyStaticClass('getData') }}
当然,上面的例子假设MyStaticClass
在你所处位置的范围内。
您必须创建一个分支扩展。在下面的例子:
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 ]
然后如上所述,在twig中,我可以使用{{ convertCurrency(55505, 'CAD', 'USD) }}
一般的方法是注册一个名为callstatic
的Twig helper函数来进行调用。
$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') %}