如何创建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 }}

而已。有关详细说明,您可以查看参考。

参考:DigitalFortress

以上是关于如何创建symfony twig过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

在 Symfony2 中使用 Twig 作为 JavaScript 的资产过滤器

如何在 Symfony (Twig) 中包含可重用的小部件?

如何创建可重用的 Twig 组件

使用 Symfony2/Twig 创建引导轮播

symfony 4 base twig方法覆盖

从 Symfony2/Twig 中的 2 位国家代码获取翻译的国家名称?