Обновление 5/14/2015
Комментаторы указывают, что я в основном неправ. Если вам действительно нужна функция, а не фильтр или макрос, вы можете сделать это так, как указано в документе Twig :
$twig = new Twig_Environment($loader);
$function = new Twig_SimpleFunction('blah', function () {
// ...
});
$twig->addFunction($function);
И использовать как
{{ blah() }}
Короче, нет, это невозможно.
Однако надежда не потеряна!
Фильтры
Если ваша функция blah()
предназначена для изменения существующей переменной, то это filter .
Пример:
//in your PHP
function format_date($date_string,$format_string) {
return date($format_string,strtotime($date_string));
}
$twig_env->addFilter('format_date',new Twig_Filter_Function('format_date'));
{# in your template #}
{{ some_date|format_date('n/j/Y') }}
(первый аргумент - это фильтруемая вами переменная, второй - обычным способом)
Макросы
Если, как вы указали выше, ваша функция просто выводит HTML, то это хороший кандидат на макрос .
Пример:
{# in your template #}
{% macro say_hello() %}
<p>Oh! Hello, world!</p>
{% endmacro %}
{# ... later on ... #}
{{ _self.say_hello() }}
или с параметрами:
{% macro input(name,value,type) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value }}">
{% endmacro %}
{{ _self.input('phone_number','867-5309') }}
{{ _self.input('subscribe','yes','checkbox') }}
Почему?
Следует помнить, что шаблоны Twig представляют представление в терминах MVC. Это означает, что они изолированы с точки зрения своего окружения и могут представлять только контекст , который вы передаете им через массив данных, который вы передаете в методе $template->render()
.
Это хорошая вещь, поскольку она отделяет вашу презентацию от вашей логики и данных. Если вы можете произвольно вызывать функции, то вы вдруг увеличиваете эту связь, что является плохой вещью.
Другая причина этого - способ, которым PHP обрабатывает обратные вызовы. Подумайте, как вам нужно передать эту функцию в ваш шаблон ... Возможно, что-то вроде этого:
function blah() {
return "<p>Oh! Hello, world!</p>";
}
$template = $twig_env->loadTemplate('template.html');
echo $template->render(array('blah'=>'blah'));
В вашем шаблоне контекстная переменная blah
теперь представляет собой просто строку, содержащую 'blah'
.
В обычном PHP, когда вы используете переменные функции, подобные этой (попробуйте использовать строковую переменную, например, функцию), она (более или менее) выполняет поиск этой функции, а затем вызывает ее. Вы не передаете функцию, просто ее имя.
Дело в том, что вы не можете передать функцию в шаблон, потому что единственным механизмом PHP для этого является строка имени, и, попав в шаблон, это имя больше не является именем функции и просто строка.
Немного затянуто, но я надеюсь, что это поможет!
Если вам нужна дополнительная документация, официальные документы: здесь .