Расширение Twig отключить автоматический выход

Я сделал расширение 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' }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
2
0
1 550
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам необходимо установить опцию is_safe:

['needs_environment' => true, 'is_safe' => ['html']]

Да, я только что сам это обнаружил ... ^^ Спасибо за ответ. Сохраню его для использования в будущем.

Sebsemillia 04.09.2018 10:49

Попробуйте использовать функцию 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 04.09.2018 10:51

@DarkBee Это будет иметь тот же эффект ... Использование safe равносильно использованию raw. Один используется в контроллере, второй - в веточке. Никаких отличий.

Preciel 04.09.2018 15:44

Это будет иметь тот же эффект, но с точки зрения удобства и простоты использования я не считаю этот ответ полезным.

DarkBee 04.09.2018 15:46

@DarkBee 'is_safe' => ['html'] просто вызовет raw для веточки ... Я не понимаю, насколько это бесполезно и насколько сложно использовать ... Оба ответа действительны. ОП выбирает первый, не более того ... Минус просто говорит читателю, что мой ответ недействителен .... Тем не менее, это ... В отношении ОП он использует таможенные функции, вызываемые в ветке, но будет случай, когда вы этого не сделаете, и вам все равно придется рендерить HTML. Таким образом, используя raw. Это лишь одно из двух возможных решений. Фильтры Twig существуют для использования.

Preciel 04.09.2018 15:52

Голос против указывает, что ответ на этот вопрос бесполезен. Не то чтобы это недействительно. Представьте, что если бы кто-то написал фильтр, который он / она должен был использовать более 100 раз в проекте, тогда ему / ей пришлось бы разместить фильтр raw за настраиваемым фильтром / функцией более 100 раз ... См. Мою точку зрения, почему это не так уж и полезно?

DarkBee 04.09.2018 16:04

Другие вопросы по теме