如果该函数有另一个参数,请在Twig中使用上下文变量作为参数调用PHP函数

时间:2019-02-27 18:14:44

标签: php twig

在PHP中,我有:

protected function registerTwigFunctions()
{
    return [
        'count_VKcomments' => 'countVKCommentsFunction'
    ];
}

public function countVKCommentsFunction($context, $pdo) {
    $url = $context['url'];
    $sql = "SELECT id, COUNT(*) FROM level_1 WHERE url = ?";
    $count = $pdo->prepare($sql)->execute([$url])->fetchColumn();
    return $count;
}

在树枝上,我有:

{% set url = global.request.uri %}
{{ count_VKcomments({ 'url': url }) }

但是仅当我从$pdo中删除countVKCommentsFunction参数时,此方法才有效,否则某些临时文件会抱怨从Twig传递的参数太少。但是我需要包含该$pdo参数,以避免重复连接到数据库,该数据库已经在另一个函数中定义为$pdo。同时,如果需要countVKCommentsFunction作为参数,我不理解如何正确调用$pdo

2 个答案:

答案 0 :(得分:0)

从Twig的角度来看,您的函数应该只接受/关心实际上需要将哪些模板传递给它。

从PHP实现的角度来看,您的函数需要访问应用程序的状态(在这种情况下为数据库连接)。

这里的解决方案是将两个任务分离:

  1. 制作并实例化有权访问必要状态的对象。
  2. 使用对象的方法作为Twig函数的回调。

那样,模板数据通过参数传递,状态数据通过实现传递。

答案 1 :(得分:0)

我最终创建了一个单独的函数来定义$pdo

private function pdo() {
    $core = Core::getInstance();
    $pdo = $core->dbh;
    return $pdo;
}

然后在每个需要使用此变量的函数中,我添加了$pdo = $this->pdo();

另一种方法是将变量声明为类成员,但最终还是按照我的描述进行了操作。