如何编写一个 symfony 的 twig 扩展
1.首先肯定是定义一个类。我习惯按照symfony的规范去进行创建文件
# src/AppBundle/Twig/Extension/GaofeiExtension.php
namespace AppBundle\Twig\Extension;
class GaofeiExtension extends \Twig_Extension
{
public function getFilters()
{
return array(
// 三种方法
// new \Twig_SimpleFilter('yourTwigName','PHP自带的函数'),
// new \Twig_SimpleFilter('yourTwigName',function($str){
return ucwords($str);
}),
new \Twig_SimpleFilter('yourTwigName', array($this, '你的自定义函数(testFilter)')),
);
}
public function testFilter($str)
{
$str = ucwords($str);
return $str;
}
/**
* {@inheritdoc}
*/
public function getName()
{
return 'gaofei';
}
在上面的代码中,我首先继承了twig自带的extension类库。然后去进行操作、
重新声明了父类的getFilters()方法
然后分别进行了两种方法去写一个twig的扩展。
第一个参数就是你的twigname 第二个为php自带函数库中的函数(一般这种方法用的比较少一点,大多数都是第三种方法)
new \Twig_SimpleFilter('yourTwigName','PHP自带的函数'),
第二种方法:
new \Twig_SimpleFilter('yourTwigName',function($str){
return ucwords($str);
}),
第三种方法:
第一个参数为你的twig名。array内第一个参数固定不变,第二个参数为你自定义的函数名(严格区分大小写)
new \Twig_SimpleFilter('yourTwigName', array($this, '你的自定义函数(testFilter)')),
在这里我用了一个php函数库的ucwords函数来进行操作。
public function testFilter($str)
{
$str = ucwords($str);
return $str;
}
当然下面的name值也是不能重复的。所以命名的时候按照规范来操作
public function getName()
{
return 'gaofei';
}
这样子你以为就实现一个扩展了? no!
你还应该将这个类注册为一个服务,并且使用 Dependency Injection Tags(依赖注入标签)去进行声明
app.twig_extension:
class: AppBundle\Twig\Extension\GaofeiExtension
public: false
tags:
- { name: twig.extension }
这样执行下来的话,你在twig中执行
{{ 'asdfsdS asfdasdas asfdasdsa'|gaofei }}
此时页面上你应该就会看到这几个字符串的首字母都改变为大写了。
file:///var/folders/2y/ps4m9jld6c140knzjk2bt5xm0000gn/T/WizNote/7cd6c7e2-b63c-4380-8e74-334fdd5fef41/index_files/804ac9d2-6c16-4885-a55c-c626341ac477.png
到这一步的话,你应该就完成了写一个twig扩展。