Последние записи в блоге

Пользовательские функции в Twig

Автор: Дмитрий Цирульников
Дата:  20 Октября 2014

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

  • Функциональных подход - у инстанса класса вызвать метод addFunction и передать в него название функции и инстанс класса Twig_Function_Function с функцией выполняемой при вызове
  • ООП подход - наследуем свой класс от Twig_Extension, в реализации класса обязательно должны быть два метода getName и getFunctions


Функциональных подход: 

require_once '/Twig/autoload.php';

$loader = new Twig_Loader_Filesystem('/path/to/templates');
$twig = new Twig_Environment($loader, array(
    'cache' => '/path/to/compilation_cache',
));
$twig = new Twig_Environment($loader);

// Добавляем функцию
$twig->addFunction('uniqid', new Twig_Function_Function('uniqid'));
function uniqid(){
	return uniqid();
}

ООП подход:

class Twig_Extension_UniqID extends Twig_Extension
{
    public function getName()
    {
        return 'Twig_Extension_UniqID';
    }


    public function getFunctions()
    {
        return array(
            new Twig_SimpleFunction('uniqid', 'Twig_Extension_UniqID::uniqid'),
        );
    }

    public static function uniqid()
    {
        return uniqid();
    }
}
  • getName -  имя расширения
  • getFunctions - функция, результатом которой должен быть массив с инстансами Twig_SimpleFunction
  • Twig_SimpleFunction - первым аргументом имя функции, вторым -  сама функция

Кому как больше нравится, но меня лично больше второй вариант удовлетворяет. Если приложение большое или есть подозрение на его рост, ООП лучше всего подойдет для расширений, но не буду разводить холиваров )

Агрегатор фриланс бирж FreelanceGrab, искать заказы на фрилансе стало еще проще.
8 крупных бирж, удобный поиск и фильтрация по проектам,
моментальное обновление ленты без перезагрузки страницы