Обновление 14.05.2015
Комментаторы отмечают, что я в основном ошибаюсь. Если вам действительно нужна функция, а не фильтр или макрос, вы можете сделать это как предложено в документации Twig:
$twig = new Twig_Environment($loader);
$function = new Twig_SimpleFunction('blah', function () {
// ...
});
$twig->addFunction($function);
И используйте как
{{ blah() }}
Короче говоря, нет, это невозможно.
Однако надежда не потеряна!
Фильтры
Если эта ваша функция blah()
предназначена для изменения существующей переменной, то это фильтр.
Пример:
//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 для этого — это строка имени, а внутри шаблона это имя больше не является именем функции, а просто строкой.< /удар>
Немного затянуто, но надеюсь поможет!
Если вам нужна дополнительная документация, официальная документация находится здесь.
person
Austin Hyde
schedule
29.08.2010
blah()
изменяет существующую переменную, лучше использовать фильтры. - person Austin Hyde   schedule 29.08.2010