如何编写一个 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
如何编写一个symfony的twig扩展

 到这一步的话,你应该就完成了写一个twig扩展。

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!