在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
。
答案 0 :(得分:0)
从Twig的角度来看,您的函数应该只接受/关心实际上需要将哪些模板传递给它。
从PHP实现的角度来看,您的函数需要访问应用程序的状态(在这种情况下为数据库连接)。
这里的解决方案是将两个任务分离:
那样,模板数据通过参数传递,状态数据通过实现传递。
答案 1 :(得分:0)
我最终创建了一个单独的函数来定义$pdo
:
private function pdo() {
$core = Core::getInstance();
$pdo = $core->dbh;
return $pdo;
}
然后在每个需要使用此变量的函数中,我添加了$pdo = $this->pdo();
另一种方法是将变量声明为类成员,但最终还是按照我的描述进行了操作。