如何在Volt(Phalcon)中设置用户定义的功能?[英] How can I set up a user defined function in Volt (Phalcon)

问题描述

如何在 Volt 中设置用户定义函数?例如,我想调用一个函数来翻译我的视图中的字符串:

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

我希望 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;
}

此方法使用 $_phrases 内部数组来查找您传递的相关键并返回您想要的短语的文本.如果未找到,则返回一个空字符串.

现在我们需要在 Volt 中注册函数.

    $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>

Volt 处理后变成:

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

本文地址:https://www.itbaoku.cn/post/1739760.html