Вызовите функцию PHP в Twig с контекстной переменной в качестве аргумента, если у функции есть другой аргумент - PullRequest
0 голосов
/ 27 февраля 2019

В 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;
}

В Twig у меня есть:

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

Но это работает, только если я удаляю аргумент $pdo из countVKCommentsFunction, в противном случае некоторыевременный файл жалуется на то, что от Twig передается слишком мало аргументов.Но мне нужно включить этот аргумент $pdo, чтобы избежать дублирования соединения с базой данных, которое уже определено как $pdo в другой функции.В то же время я не понимаю, как правильно вызывать countVKCommentsFunction при условии, что ему нужно $pdo в качестве аргумента.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

В итоге я создал отдельную функцию, которая определяет $pdo:

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

Затем в каждую функцию, которая должна использовать эту переменную, я добавил $pdo = $this->pdo();

Другой подход был быобъявить переменную как член класса, но в итоге я сделал это так, как я описал.

0 голосов
/ 27 февраля 2019

С точки зрения Twig, ваша функция должна принимать / заботиться только о том, какой шаблон практически должен ему быть передан.

С точки зрения реализации PHP вашей функции необходим доступ к состоянию вашего приложения (в данном случае это соединение с базой данных).case).

Решение здесь состоит в том, чтобы разделить две задачи:

  1. Создать и создать экземпляр объекта, который имеет доступ к необходимому состоянию.
  2. Использовать метод объектакак обратный вызов для функции Twig.

Таким образом, данные шаблона поступают через аргументы, а данные состояния - через реализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...