dyonis
@dyonis
Web разработчик

Как выполнить функцию в статической переменной?

У меня есть некий класс 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 ?
  • Вопрос задан
  • 155 просмотров
Пригласить эксперта
Ответы на вопрос 1
dyonis
@dyonis Автор вопроса
Web разработчик
Вопрос решился созданием расширения класса Twig_Extension в котором можно переопределить/добавить всё что нужно.
twig.sensiolabs.org/doc/2.x/advanced.html#creating...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы