Php 如何在Volt(Phalcon)中设置用户定义的功能

Php 如何在Volt(Phalcon)中设置用户定义的功能,php,phalcon,volt,Php,Phalcon,Volt,如何在Volt中设置用户定义的功能?例如,我想调用一个函数,将视图中的字符串转换为: <div class='page-header'> <h2>{{ tr('session_login_title') }}</h2> </div> {{tr('session_login_title')} 我希望tr映射到一个函数\My\Locale::translate($key)Volt函数充当字符串替换,实际上不调用底层函数。Volt将函数转换

如何在Volt中设置用户定义的功能?例如,我想调用一个函数,将视图中的字符串转换为:

<div class='page-header'>
    <h2>{{ tr('session_login_title') }}</h2>
</div>

{{tr('session_login_title')}

我希望
tr
映射到一个函数
\My\Locale::translate($key)

Volt函数充当字符串替换,实际上不调用底层函数。Volt将函数转换为相关字符串,然后由PHP进行解释

假设您有一个
Locale
类,它有一个
translate
方法:

public static function translate()
{
    $return = '';

    if (isset(self::$_phrases[$key]))
    {
        $return = self::$_phrases[$key];
    }

    return $return;
}
此方法使用
$\u短语
内部数组查找传递的相关键并返回所需短语的文本。如果未找到,则返回空字符串

现在我们需要以伏特为单位注册函数

    $di->set(
        'volt',
        function($view, $di) use($config)
        {
            $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
            $volt->setOptions(
                array(
                    'compiledPath'      => $config->app_volt->path,
                    'compiledExtension' => $config->app_volt->extension,
                    'compiledSeparator' => $config->app_volt->separator,
                    'stat'              => (bool) $config->app_volt->stat,
                )
            );
            $volt->getCompiler()->addFunction(
                'tr',
                function($key)
                {
                    return "\\My\\Locale::translate({$key})";
                }
            );

            return $volt;
        },
        true
    );
注意
tr
功能是如何注册的。它使用传递的
$key
参数返回字符串
\My\Locale::translate({$key})
。此Volt语法将被转换为PHP指令并由PHP执行。因此,视图字符串:

<div class='page-header'>
    <h2>{{ tr('session_login_title') }}</h2>
</div>

{{tr('session_login_title')}
经过Volt处理后,它变成:

<div class='page-header'>
    <h2><?php echo \My\Locale::translate('session_login_title') ?></h2>
</div>