Я сделал расширение twig, чтобы иметь возможность вызывать функции в шаблонах, но, к сожалению, теперь отображаемое HTML-содержимое этих функций экранировано. Ты хоть представляешь, как я могу это отключить?
FrontendTwigExtension.php
class FrontendTwigExtension extends Twig_Extension
{
/**
* @var DataProviderService
*/
private $dataProvider;
/**
* FrontendTwigExtension constructor.
* @param DataProviderService $dataProvider
*/
public function __construct(DataProviderService $dataProvider)
{
$this->dataProvider = $dataProvider;
}
/**
* @return array
*/
public function getFunctions(): array
{
return array(
new Twig_Function('getProductDetailData',
[$this, 'getProductDetailData'],
['needs_environment' => true]
),
new Twig_Function('getPageHeader',
[$this, 'getPageHeader'],
['needs_environment' => true]
)
);
}
/**
* @param Twig_Environment $env
* @return string
* @throws Twig_Error_Loader
* @throws Twig_Error_Runtime
* @throws Twig_Error_Syntax
*/
public function getPageHeader(Twig_Environment $env): string
{
return $env->render('Component/PageHeader/pageHeader.html.twig');
}
/**
* @param Twig_Environment $env
* @return string
* @throws Twig_Error_Loader
* @throws Twig_Error_Runtime
* @throws Twig_Error_Syntax
*/
public function getProductDetailData(Twig_Environment $env): string
{
$service = new ProductDetailDataService($this->dataProvider);
return $env->render('Module/ProductDetailPage/productDetailData.html.twig',
[
'productData' => $service->getData()
]
);
}
}
template.html.twig
{% extends 'base.html.twig' %}
{% block pageHeader %}
{{ getPageHeader() }}
{{ getProductDetailData() }}
{% endblock %}
services.yaml
App\Extension\FrontendTwigExtension:
arguments:
- '@App\DataProvider\DataProviderService'
tags:
- { name: 'twig.extension' }




Вам необходимо установить опцию is_safe:
['needs_environment' => true, 'is_safe' => ['html']]
Попробуйте использовать функцию raw в twig.
{% extends 'base.html.twig' %}
{% block pageHeader %}
{{ getPageHeader()|raw }}
{{ getProductDetailData()|raw }}
{% endblock %}
источник: https://twig.symfony.com/doc/2.x/filters/raw.html
Вопрос касается введенного настраиваемого фильтра / функции OP. Использование raw здесь не рекомендуется, так как вы можете просто пометить фильтр как безопасный в расширении. См. Ответ G1.3
@DarkBee Это будет иметь тот же эффект ... Использование safe равносильно использованию raw. Один используется в контроллере, второй - в веточке. Никаких отличий.
Это будет иметь тот же эффект, но с точки зрения удобства и простоты использования я не считаю этот ответ полезным.
@DarkBee 'is_safe' => ['html'] просто вызовет raw для веточки ... Я не понимаю, насколько это бесполезно и насколько сложно использовать ... Оба ответа действительны. ОП выбирает первый, не более того ... Минус просто говорит читателю, что мой ответ недействителен .... Тем не менее, это ... В отношении ОП он использует таможенные функции, вызываемые в ветке, но будет случай, когда вы этого не сделаете, и вам все равно придется рендерить HTML. Таким образом, используя raw. Это лишь одно из двух возможных решений. Фильтры Twig существуют для использования.
Голос против указывает, что ответ на этот вопрос бесполезен. Не то чтобы это недействительно. Представьте, что если бы кто-то написал фильтр, который он / она должен был использовать более 100 раз в проекте, тогда ему / ей пришлось бы разместить фильтр raw за настраиваемым фильтром / функцией более 100 раз ... См. Мою точку зрения, почему это не так уж и полезно?
Да, я только что сам это обнаружил ... ^^ Спасибо за ответ. Сохраню его для использования в будущем.