Как вставить в переменную twig кусок кода из php переменной?
я использую версию php 7.4.16, slim 4 и twig ^3.2 для создания блога. Проблема заключается в том что моя перремнная вставляется как строка, а не как часть разметки html
Структура проетка
> templates:
> base.twig
> home.twig
> index.php
содержимое home.twig
<div> Lorem <div>
содержимое base.twig
<!DOCTYPE html>
<html lang="en">
<head>
<title> {{ title }} </title>
</head>
<body>
{{ content }}
</body>
</html>
В index.php я выполняю код
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$app->get('/', function (Request $request, Response $response, $args) use($view) {
$loader = new \Twig\Loader\FilesystemLoader('templates');
$twig = new \Twig\Environment($loader, [
'cache' => 'cache',
]);
$home = file_get_contents ('templates/home.twig'); // получаю содержимое из home.twig
echo $twig->render('base.twig', ['title' => 'home', 'content' => $home ]); // тут я вставляю в перемнную content содержимое $home
return $response;
});
$app->run();
Подскажите пожалуйста, как решить данную проблему ?
Ответы (2 шт):
Твиг по умолчанию экранирует все данные при выводе. Чтобы выводить данные как есть, используй фильтр raw:
<body>
{{ content|raw }}
</body>
Экранирование по умолчанию нужно, чтобы некоторые не жаловались, что у них возникает какой-нибудь XSS из-за твига.
Дополнительно можно установить в false опцию autoescape при создании объекта класса Environment, но это опять же небезопасно, так как в этом случае вообще все выводимые переменные будут выводиться как есть, что повышает шансы XSS.
Twig поддерживает layout'ы - это то, что вам нужно
base.twig перепишите так:
<!DOCTYPE html>
<html lang="en">
<head>
<title> {{ title }} </title>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
home.twig так:
{% extends 'base.twig' %}
{% block content %}
<div> Lorem <div>
{% endblock %}
И index.php так:
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/vendor/autoload.php';
$app = AppFactory::create();
$loader = new \Twig\Loader\FilesystemLoader('templates');
$twig = new \Twig\Environment($loader, [
'cache' => 'cache',
]);
$app->get('/', function (Request $request, Response $response, $args) use($twig) {
// лучше получать объект twig через зависимости, но это уже другая тема
$response->getBody()->write($twig->render('home.twig', [
'title' => 'home',
]));
return $response;
});
$app->run();
