Это может быть достигнуто путем передачи экземпляра twig
в сторону вызываемого объекта внутри Twig_SimleFunction
$twig->addFunction(new \Twig_SimpleFunction('fibonacci', function($n) use($twig) {
if ($n == 0) return 0;
if ($n == 1) return 1;
$fn = $twig->getFunction('fibonacci')->getCallable();
return $fn($n -1) + $fn($n - 2);
}));
Было бы намного проще, если бы вы использовали класс расширения, вместо того, чтобы пытаться делать рекурсию без него.
С помощью класса расширения вы можете просто сделать это следующим образом
class Project_Twig_Extension extends Twig_Extension {
public function getFunctions() {
return array(
new Twig_Function('fibonacci', array($this, 'fibonacci')),
);
}
private function fibonacci($n) {
if ($n == 0) return 0;
if ($n == 1) return 1;
return $this->fibonacci($n -1) + $this->fibonacci($n - 2);
}
}
note Чтобы зарегистрировать расширение для twig
, просто выполните:
$twig->addExtension(new Project_Twig_Extension());