В настоящее время я помещаю свою функцию в класс и передаю экземпляр этого класса в шаблон и вызываю требуемую функцию как класс метод.
{{ unneededclass.blah() }}
Мне нужно сделать, как показано ниже
{{ blah() }}
Возможно ли это?
Комментаторы отмечают, что я в основном не прав. Если вам действительно нужна функция, а не фильтр или макрос, вы можете сделать это, как предложено в документации 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 для этого — это строка имени, а оказавшись внутри шаблона, это имя больше не является именем функции, а просто строкой.
Немного длинновато, но надеюсь поможет!
Если вам нужна дополнительная документация, официальная документация находится здесь.