在 Twig 中创建函数不起作用

Creating Functions in Twig not working

我正在尝试转换一些 PHP 代码,以便它使用 Twig 作为其模板引擎。

我之前开发的代码的工作方式是生成 HTML 下拉列表涉及调用静态方法 (formTools::generateSchoolList()),该方法查询数据库,然后将结果回显到 HTML(意大利面条代码)。

我在创建和显示函数结果时遇到了一些问题,我希望有人能帮助我解决我收到的错误。在 formTools.class.php 中,我指的是此示例的单个静态方法,尽管 Twig 文档建议使用匿名方法(我在匿名函数中调用了上面的静态函数),但我无法将其用于工作,所以我直接将 Twig_SimpleFunction 可调用参数设为静态方法。

如果我这样做,我会得到(在静态方法中使用 return):

Parse error: syntax error, unexpected '<' in /Path_To_Vendor/vendor/twig/twig/lib/Twig/Environment.php(332) : eval()'d code on line 46

Fatal error: Class '__TwigTemplate_96fa0bd50202e1016defd78dc63d0ee7f8c3432728ffb0946f67a6a1e5c89437' not found in /Path_To_Vendor/vendor/twig/twig/lib/Twig/Environment.php on line 346

如果我在静态函数中回显,我得到:

Fatal error: Call to undefined method Twig_SimpleFunction::compile() in /path_to_vendor/vendor/twig/twig/lib/Twig/Node/Expression/Call.php on line 27

formTools.class.php

/**
 * Generates a list of all available schools in a dropdown box
 *
 * @throws Exception
 */
static function generateSchoolList() {
    $db = new database(databaseHost, databaseUser, databasePass, databaseName);
    $query = "SELECT * FROM `schoolCodes`";
    $codes = $db->query($query);

    if (isset($codes)) {
        $result = "<select name='schoolCode'>";
        $result .= "<option class='dropdown' value=''>&nbsp;&nbsp;&nbsp;&nbsp;</option>";
        $result .= "<option class='dropdown' disabled>----</option>";
        foreach ($codes as $code) {
            $result .= "<option class='dropdown' value='{$code['codeID']}'>{$code['schoolName']} ({$code['code']})</option>";
        }
        $result .= "</select>";
        **echo/return** $result;
    } else {
        throw new Exception("The schoolCodes table is empty.");
    }
}

formviewer.php

require_once('../vendor/autoload.php');
$ft = new formTools();
$it = new ingestTasks();

Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem('../templates');
$twig = new Twig_Environment($loader);

$function = new Twig_SimpleFunction('generateSchoolList',
    formTools::generateSchoolList()
);
$twig->addFunction($function);

$template = $twig->loadTemplate('viewPlayersByRoster.twig');
echo $twig->render($template);

viewPlayersByRoster.twig

{% extends "base.twig" %}

{% block title %}View Players by Roster{% endblock %}

{% block content %}
<p class="formDesc">This form is for viewing all players on a given roster.</p>
<form action="formviewer.php?action=viewPlayersByRoster" target="_self" method="post">
    <input hidden="hidden" value="viewPlayersByRoster" name="action"  title="action"/>
    <table>
        <tr>
            <td class="rightAlignText"><label for="schoolCode">School:</label></td>
            <td>{{ generateSchoolList() }}</td>
        </tr>
    </table>
</form>
{% endblock %}

编辑: 使用 PHP 5.5.24(无法更新)、Twig 1.18.2 并使用 Composer。

composer.json

"require": {
    "twig/twig": "v1.18.2"
  },
      "autoload": {
    "classmap": ["libs/"]
}

编辑 2:

改成tacone说的,得到了​​这个:

Catchable fatal error: Object of class __TwigTemplate_96fa0bd50202e1016defd78dc63d0ee7f8c3432728ffb0946f67a6a1e5c89437 could not be converted to string in /path_to_vendor/vendor/twig/twig/lib/Twig/Loader/Filesystem.php on line 216

/Filesystem.php

protected function normalizeName($name)
{
    return preg_replace('#/{2,}#', '/', strtr((string) $name, '\', '/'));
}

formTools.class.php

public function __toString() {
    return $this->formTools;
}

您正在执行静态方法而不是传递其坐标。

尝试使用 PHP 经典回调语法:

$function = new Twig_SimpleFunction('generateSchoolList', ['formTools', 'generateSchoolList']);
$twig->addFunction($function);

另见