Php 小枝传递函数到模板中

Php 小枝传递函数到模板中,php,function,inheritance,twig,template-engine,Php,Function,Inheritance,Twig,Template Engine,目前,我将我的函数放在一个类中,并将该类的一个实例传递到模板中,然后作为类方法调用我所需的函数 {{ unneededclass.blah() }} 我需要像下面这样做 {{ blah() }} 有可能吗?2015年5月14日更新 评论人士指出,我大错特错。如果您确实需要一个函数,而不是一个过滤器或宏,您可以按以下方式执行: 和使用一样 {{ blah() }} 简言之,不,这是不可能的 然而,希望并没有丧失 过滤器 如果您的函数blah()用于修改现有变量,则它是一个过滤器 例如: /

目前,我将我的函数放在一个类中,并将该类的一个实例传递到模板中,然后作为类方法调用我所需的函数

{{ unneededclass.blah() }}
我需要像下面这样做

{{ blah() }}
有可能吗?

2015年5月14日更新 评论人士指出,我大错特错。如果您确实需要一个函数,而不是一个过滤器或宏,您可以按以下方式执行:

和使用一样

{{ blah() }}

简言之,不,这是不可能的

然而,希望并没有丧失

过滤器 如果您的函数
blah()
用于修改现有变量,则它是一个过滤器

例如:

//in your PHP
function format_date($date_string,$format_string) {
    return date($format_string,strtotime($date_string));
}
$twig_env->addFilter('format_date',new Twig_Filter_Function('format_date'));

{# in your template #}
{{ some_date|format_date('n/j/Y') }}
{# in your template #}
{% macro say_hello() %}
<p>Oh! Hello, world!</p>
{% endmacro %}

{# ... later on ... #}
{{ _self.say_hello() }}
(第一个参数是要筛选的变量,第二个参数是通过正常方式提供的)

宏 如前所述,如果函数只是输出HTML,那么它是宏的一个很好的候选者

例如:

//in your PHP
function format_date($date_string,$format_string) {
    return date($format_string,strtotime($date_string));
}
$twig_env->addFilter('format_date',new Twig_Filter_Function('format_date'));

{# in your template #}
{{ some_date|format_date('n/j/Y') }}
{# in your template #}
{% macro say_hello() %}
<p>Oh! Hello, world!</p>
{% endmacro %}

{# ... later on ... #}
{{ _self.say_hello() }}
在模板中,上下文变量
blah
现在只是一个包含
“blah”
的字符串

在普通PHP中,当您使用像这样的变量函数(尝试像函数一样使用字符串变量)时,它(或多或少)会对该函数执行查找,然后调用它。您没有传递函数,只是传递它的名称


问题是,您不可能将函数传递到模板中,因为PHP唯一的传递机制是按名称字符串,一旦进入模板,该名称就不再是函数名,而只是字符串

有点啰嗦,但我希望这有帮助


如果你想要更多的文档,官方文档就是。

我和你一样迷路了,我的朋友,但是在网上搜索了一个答案却没有找到,我决定看看我是否可以自己做。因此,我想在这里发布我的解决方案(尽管我知道这篇文章很旧),因为如果你搜索这个问题,这是谷歌的第一次成功

在这里,其实很简单:

我创建了一个包含函数和变量的类,例如:

class functionContainer{
        function getRandomNumber()
        {
                return rand();
        }
}
$values = array(
'functions'=> new functionContainer()
);
现在我们将$values作为一个数组,它包含一个函数“getRandomNumber()”的对象

呈现模板文件时,将此类作为值包括在内:

$twig->render('random.html', $values);
这样,在模板文件中,您只需调用此方法即可调用函数并获得结果:

{{ functions.getRandomNumber }}
完整答案:

我更喜欢这样使用细枝扩展:

namespace Some\Twig\Extensions;

class MenuExtensions extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('sidebar_menu', [$this, 'generate_sidebar_menu']),
        );
    }

    public function generate_sidebar_menu($menu){
        return $menu;
    }

    public function getName()
    {
        return 'menu';
    }
}
在模板中:

{{ sidebar_menu('some text') }}

尽管不能直接调用PHP,但twig是可扩展的。您可以添加一个可调用的过滤器,以便应用于传递给模板的PHP函数

namespace My\Twig\Extension;

class LambdaFilter extends \Twig_Extension {

    public function getName() {
        return 'lambda_filter';
    }

    public function getFilters() {
        return array(
            new \Twig_SimpleFilter('call', array($this, 'doCall'))
        );
    }

    public function doCall() {
        $arguments = func_get_args();
        $callable = array_shift($arguments);
        if(!is_callable($callable)) {
            throw new InvalidArgumentException();
        }
        return call_user_func_array($callable, $arguments);
    }

}
现在,如果将变量
myfunc
传递给模板,则可以执行
myfunc调用(arg1,arg2)
。您甚至可以执行更高阶的函数
“array\u filter”|调用(my\u array,my\u func)
,并且您可以始终在过滤器中执行更多操作,例如接受数组作为参数等等。

使用

在管理器/控制器/服务中创建匿名类

     $functions = new class($router)
    {
        public function __construct($router)
        {
            $this->router = $router;
        }

    public function getRowUrl(FileManager $fileManager)
    {
        if ($fileManager->isNode()) {
            return $this->router->generate('...', ['parent' => ...]);
        }
        return $this->router->generate('...', ['entity' => ...]);
    }
};
将参数粘贴到视图中

$params=[
            'functions' => $functions

        ];



    return new Response($this->twig->render('...:index.html.twig', $params));
在视图中使用函数

 {% set rowUrl = functions.rowUrl(entity) %}

我有一个函数blah(),如何在twig中传递和调用它(使用twig模板语法?),这个函数做什么?我几周前才开始使用Twig,但我很确定你不能这么做。如果
blah()。顺便说一句,谢谢,我将把我的函数粘贴到一个类中。那样的话,你看到了吗?(它们大约在页面的一半)这可能正是您想要的,并且可能比将内容放入类中更容易实现。我使用它们来创建简单的表单元素和链接。Twig也支持函数,在某些情况下,表单是用函数生成的,dude“你不可能将函数传递到模板中”--你一定是在闭包存在之前写的。@Mark:天哪,我在想什么?从2009年的5.3起,关闭就开始了。我将更新我的答案,以反映这不再是最新的。Twig_SimpleFunction已被弃用。现在使用TwigFunction。警告:\Twig\u Function\u方法现在已被弃用,将在2.x中删除
 {% set rowUrl = functions.rowUrl(entity) %}