У меня есть некий класс View.
Его экземпляр создаётся во время работы контроллера.
Например:
$view = new View('index.twig');
$view->render();
Внутри View создаётся экземпляр Twig_Environment, где задаются параметры для шаблонизатора.
Там же задаются такие вещи как глобальные переменные для всех шаблонов и функции расширения функционала Twig:
class View
{
public function __construct($tpl = "")
{
$loader = new Twig_Loader_Filesystem(TPL_DIR);
$this->twig = new Twig_Environment($loader, self::$twigParams);
// Расширение функционала Twig
$twig->addFunction(new Twig_SimpleFunction('file_exists', function($filename)
{
return file_exists(ROOT.$filename);
}));
// Здесь ещё много таких функций и фильтров
if($tpl)
$this->setTpl($tpl);
}
...
}
При такой конструкции возникает необходимость постоянно редактировать класс View чтобы изменить набор фильтров/функций, а это не совсем правильно.
Я хочу вынести эти действия в какой-нибудь системный контроллер init, где задавать все эти настройки, а в классе View потом их получать при инициализации.
Попробовал по аналогии с JS:
// controllers/init.php
View::$extFunc = function(Twig_Environment &$twig)
{
$twig->addFunction(new Twig_SimpleFunction('file_exists', function($filename)
{
return file_exists(ROOT.$filename);
}));
}
// View.class.php
class View
{
public static $extFunc;
public function __construct($tpl = "")
{
...
if(is_callable(self::$extFunc)) // Вот эта проверка проходит, значит там-таки функция
self::$extFunc($this->twig); // Вот тут ошибка "Function name must be a string"
...
}
}
Может есть другой способ выполнить функцию, которая находится в переменной $extFunc ?