6

我有一个基于 twig 的 Symfony 2 项目。由于 Symfony 2 的性质,使用了命名空间。因此,我无法在命名空间之外提供全局函数。

这是我的 Twig 扩展

<?php
namespace Web\MailBundle\Twig;

use Twig_Extension, Twig_SimpleFilter;

class Twig extends Twig_Extension
{
    public function getName()
    {
        return 'twig_extension';
    }

    public function getFilters() {
        return array(
            'shortKey'  => new Twig_SimpleFilter('shortKey', 'myCustomFilterFunction')
        );
    }

    public function myCustomFilterFunction() {
        //code here...
    }

结果FatalErrorException: Error: Call to undefined function myCustomFilterFunction()

为什么:因为,Twig 试图找到这个函数,但它在一个类中。如果这次我将它移到课外,我将面临命名空间。因为它是命名空间的。

研究:我挖掘代码。树枝做同样的事情。他们在课堂之外编写过滤器和函数。但由于命名空间,我不能这样做。如果可能的话,我想通过使用适当的解决方案来做到这一点。如果失败;我将提供最新的解决方案,即创建另一个没有命名空间的 php 文件并将其包含到项目中......

--

我怎样才能克服它?Twig Filter 已被弃用,我们必须使用 SimpleFilter 方法。但我只是无法完成它。

4

1 回答 1

8

您可以将基于数组的可调用对象作为第二个参数传递给Twig_SimpleFilter构造函数 - 在您的情况下,使用如下数组:

public function getFilters() {
    return array(
        'shortKey'  => new Twig_SimpleFilter('shortKey', array($this, 'myCustomFilterFunction'))
    );
}

使用过滤器时,它将使用您的对象的方法。

请参阅Twig 文档中的示例。

于 2013-02-04T12:58:48.380 回答