twig - передать функцию в шаблон

В настоящее время я помещаю свою функцию в класс и передаю экземпляр этого класса в шаблон и вызываю требуемую функцию как класс метод.

{{ unneededclass.blah() }}

Мне нужно сделать, как показано ниже

{{ blah() }}

Возможно ли это?

23
задан dreftymac 8 February 2017 в 23:16
поделиться

1 ответ

Обновление от 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 для этого — это строка имени, а оказавшись внутри шаблона, это имя больше не является именем функции, а просто строкой.

Немного длинновато, но надеюсь поможет!

Если вам нужна дополнительная документация, официальная документация находится здесь.

33
ответ дан 29 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

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