如何创建symfony twig过滤器?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何创建symfony twig过滤器?相关的知识,希望对你有一定的参考价值。
例如,我的包名称空间是FacebookBundleFacebookBundleExtension
。
使用此方法我如何创建树枝延伸?
答案
您还可以使用getFunctions()创建twig函数
class FacebookExtension extends Twig_Extension
{
public function getFunctions()
{
return array(
'myFunction' => new Twig_Filter_Method($this, 'myFunction'),
);
}
public function myFunction($arg1)
{
return $arg1;
}
使用这样的功能:
{{ myFunction('my_param') }}
另一答案
一切都在这里:How to write a custom Twig Extension。
1.创建扩展:
// src/Facebook/Bundle/Twig/FacebookExtension.php
namespace FacebookBundleTwig;
use Twig_Extension;
use Twig_Filter_Method;
class FacebookExtension extends Twig_Extension
{
public function getFilters()
{
return array(
'myfilter' => new Twig_Filter_Method($this, 'myFilter'),
);
}
public function myFilter($arg1, $arg2='')
{
return sprintf('something %s %s', $arg1, $arg2);
}
public function getName()
{
return 'facebook_extension';
}
}
2.注册扩展即服务
# src/Facebook/Bundle/Resources/config/services.yml
services:
facebook.twig.facebook_extension:
class: FacebookBundleTwigAcmeExtension
tags:
- { name: twig.extension }
3.使用它
{{ 'blah'|myfilter('somearg') }}
另一答案
自Symfony 2.1以来,Twig_Filter_Method类已被弃用
请使用Twig_SimpleFilter类,如以下示例所示:
SRC Acme的包 CoreBundle 嫩枝 DatetimeExtension.php
<?php
namespace AcmeBundleCoreBundleTwig;
use SymfonyComponentDependencyInjectionContainerInterface;
class DatetimeExtension extends Twig_Extension
{
/**
* @var SymfonyComponentDependencyInjectionContainerInterface
*/
private $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function getFilters()
{
return array(
'dateFormat' => new Twig_SimpleFilter('dateFormat', array($this, 'dateFormat')),
'datetimeFormat' => new Twig_SimpleFilter('datetimeFormat', array($this, 'datetimeFormat'))
);
}
/**
* @param mixed $date
* @return string
*/
public function dateFormat($date)
{
$format = $this->container->getParameter('acme_core.date_format');
return $this->format($date, $format);
}
/**
* @param mixed $date
* @return string
*/
public function datetimeFormat($date)
{
$format = $this->container->getParameter('acme_core.datetime_format');
return $this->format($date, $format);
}
/**
* @param mixed $date
* @param string $format
* @throws Twig_Error
* @return string
*/
private function format($date, $format)
{
if (is_int($date) || (is_string($date) && preg_match('/^[0-9]+$/iu', $date))) {
return date($format, intval($date, 10));
} else if (is_string($date) && !preg_match('/^[0-9]+$/', $date)) {
return date($format, strtotime($date));
} else if ($date instanceof DateTime) {
return $date->format($format);
} else {
throw new Twig_Error('Date or datetime parameter not valid');
}
}
public function getName()
{
return 'datetime_extension';
}
}
SRC Acme的包 CoreBundle 资源设置 services.yml
services:
acme_core.twig.datetime_extension:
class: AcmeBundleCoreBundleTwigDatetimeExtension
arguments: [@service_container]
tags:
- { name: twig.extension }
用法示例:
{{ value|datetimeFormat }}
Symfony文档:http://symfony.com/doc/master/cookbook/templating/twig_extension.html
Twig文档:http://twig.sensiolabs.org/doc/advanced.html#id3
另一答案
没有给出的答案适用于Symfony 3.4及以上版本。
For Symfony 3.4, 4.x
// src/TwigExtension/customFilters.php
namespace AppTwigExtension;
use TwigTwigFilter;
class customFilters extends Twig_Extension {
public function getFilters() {
return array(
new TwigFilter('base64_encode', array($this, 'base64_en'))
);
}
public function base64_en($input) {
return base64_encode($input);
}
}
然后在你的枝条模板中你可以做到
{{ 'hello world' | base64_encode }}
而已。有关详细说明,您可以查看参考。
以上是关于如何创建symfony twig过滤器?的主要内容,如果未能解决你的问题,请参考以下文章
在 Symfony2 中使用 Twig 作为 JavaScript 的资产过滤器