«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Использование Twig для рендеринга Markdown с помощью PHP

Использование Twig для рендеринга Markdown с помощью PHP

Опубликовано 8 ноября 2024 г.
Просматривать:659

Using Twig for rendering Markdown with PHP

Twig — это шаблонизатор для рендеринга HTML при разработке веб-приложений с помощью Symfony.
Однако гибкость Twig выходит за рамки создания только HTML-страниц. Это может быть мощный инструмент для доставки контента по нескольким каналам, например, для генерации файлов Markdown, вывода JSON и даже простого текста — и все это из одного и того же набора контента.

Эта адаптивность позволяет создавать контент для разных каналов.

Вы можете использовать Twig для генерации HTML, Markdown, JSON, текста и т. д.

Вариант использования: получение и рендеринг рецепта в формате Markdown с помощью Symfony.

В этом примере мы используем HTTP-клиент Symfony для получения рецепта из внешнего API (https://dummyjson.com/recipes/1) и рендеринга его как документа Markdown с помощью Twig.
Этот подход показывает, как можно объединить мощные пакеты Symfony, такие как HTTP-клиент Symfony для получения внешних данных и Twig для рендеринга представлений, для доставки контента по нескольким каналам, например, отчетов Markdown в инструменте командной строки.

Команда/скрипт, который мы собираемся создать, извлекает данные рецепта (название, описание, ингредиенты и инструкции) из API, обрабатывает их, а затем использует Twig для вывода содержимого в структурированном формате Markdown. Этот практический пример использования показывает, как использовать Twig помимо веб-шаблонов, что делает его универсальным для создания контента в различных форматах.

Итак, мы собираемся использовать:

  • Консоль Symfony Компонент https://symfony.com/doc/current/comComponents/console.html для создания инструмента командной строки
  • HTTP-клиент Symfony https://symfony.com/doc/current/http_client.html для получения и использования HTTP API
  • Symfony Twig https://twig.symfony.com/doc/3.x/intro.html#installation для рендеринга данных
  • Рецепты API: мы выберем один «фиктивный» рецепт https://dummyjson.com/recipes/1, чтобы показать и продемонстрировать процесс получения структурированного JSON и преобразования его в файл уценки. .

Установка необходимых компонентов Symfony

Убедитесь, что у вас установлены необходимые компоненты для HTTP-запросов и создания команд:

composer require symfony/http-client symfony/console twig/twig

Создайте команду Symfony

Сначала давайте создадим новую команду Symfony.

Если вы хотите узнать больше о том, как создать инструмент командной строки с использованием компонента Symfony Command, я написал об этом специальную статью: https://dev.to/robertobutti/building-a-command-line-tool -with-php-and-symfony-console-4n6g

Классы команд обычно находятся в каталоге src/Commands.

# create a new empty directory
mkdir -p src/Commands
# create a new empty file
touch src/Commands/FetchRecipeCommand.php

Класс команды (например, src/Commands/FetchRecipeCommand.php):

setName('recipe')
            ->setDescription('Prints a recipe in Markdown')
            ->setHelp('This command prints a simple recipe in Markdown.');
        // Step 1: loading the Twig environment
        $loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/../resources/views');
        $twig = new \Twig\Environment(
            $loader,
            // Optional: Enable caching for better performance
            /*[
                'cache' => __DIR__ . '/../../cache',
            ]*/
        );

        $this->twig = $twig;
        parent::__construct();
    }

    protected function configure()
    {
        $this->setDescription('Fetches a recipe from an API and renders it as Markdown');
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        // Step 2: Initialize the HTTP client and fetch the recipe
        $client = HttpClient::create();
        $response = $client->request('GET', 'https://dummyjson.com/recipes/1');

        // Step 3: obtain the array of info
        $recipeData = $response->toArray();

        // Step 4: Render the template using Twig, returning a string
        $markdownOutput = $this->twig->render('recipe.md.twig', $recipeData);

        // Step 5: Output the generated Markdown
        $output->writeln($markdownOutput);

        return Command::SUCCESS;
    }
}

Вот подробное объяснение каждого шага в примере FetchRecipeCommand.

Пошаговая разбивка

Шаг 1. Загрузка среды ветки

Чтобы использовать Twig вне его обычного веб-контекста, например, в инструменте командной строки PHP, вам сначала необходимо инициализировать его вручную через класс Twig\Environment. Вот пример настройки Twig с помощью консольной команды:

$loader = new \Twig\Loader\FilesystemLoader(__DIR__ . '/../resources/views');
$twig = new \Twig\Environment(
    $loader,
    // Optional: Enable caching for better performance
    /*[
        'cache' => __DIR__ . '/../../cache',
    ]*/
);
$this->twig = $twig;

Объяснение:

  • Среда twig инициализируется путем создания FilesystemLoader, который сообщает Twig, где найти шаблоны. Этот случай указывает на папку src/resources/views, где хранятся ваши шаблоны Twig.
  • Затем создается экземпляр среды $twig, которая отвечает за рендеринг шаблонов. Можно включить дополнительное кэширование для повышения производительности за счет хранения предварительно скомпилированных шаблонов.
  • Наконец, инициализированная среда $twig назначается $this->twig для последующего использования (в методе выполнения()).

Шаг 2: инициализация HTTP-клиента и получение рецепта

$client = HttpClient::create();
$response = $client->request('GET', 'https://dummyjson.com/recipes/1');

Объяснение:

  • HTTP-клиент Symfony создается с использованием метода HttpClient::create(), который позволяет команде выполнять HTTP-запросы.
  • Чтобы получить рецепт, метод request() выполняет GET-запрос к указанному URL-адресу (https://dummyjson.com/recipes/1).
  • API возвращает ответ в формате JSON, хранящийся в переменной $response.

Шаг 3: получение массива информации

$recipeData = $response->toArray();

Объяснение:

  • Метод toArray() преобразует ответ JSON от API в массив PHP. Этот массив содержит данные рецепта (например, название, ингредиенты, инструкции), которые будут использоваться для заполнения шаблона Twig на следующем шаге.

Шаг 4: рендеринг шаблона с помощью Twig

$markdownOutput = $this->twig->render('recipe.md.twig', $recipeData);

Объяснение:

  • Метод render() среды Twig генерирует выходные данные Markdown. Он загружает шаблон (recipe.md.twig) из папки src/resources/views.
  • Данные рецепта, полученные из API ($recipeData), передаются в шаблон, где они заменяют заполнители, такие как название рецепта, ингредиенты и инструкции, создавая полностью отформатированный файл Markdown.
  • Обработанное содержимое Markdown (строка, возвращаемая методом render()) сохраняется в переменной $markdownOutput.

Шаг 5: создание выходных данных для сгенерированного Markdown

$output->writeln($markdownOutput);

Объяснение:

  • Окончательный контент Markdown выводится на консоль с помощью метода $output->writeln(). Этот метод выводит строку на консоль, позволяя пользователям видеть отформатированный рецепт в формате Markdown (в конечном итоге вы можете перенаправить вывод в файл в оболочке).

Создание стартового файла

Вам необходимо создать стартовый файл, чтобы позволить пользователю запускать вашу команду Symfony непосредственно из оболочки. (В этой статье мы не создаем приложение Symfony; мы создаем PHP-скрипт с использованием пакетов Symfony.)
В каталоге проекта, где находится файл композитора.json и каталог src, вы можете создать файл моего приложения.

#!/usr/bin/env php
setDefaultCommand("recipe");

$app->add(new FetchRecipeCommand());


$app->run();

Чтобы правильно использовать пространства имен и классы, обязательно установите раздел автозагрузки в файле композитора.json:

{
    "require": {
        "symfony/http-client": "^7.1",
        "symfony/console": "^7.1",
        "twig/twig": "^3.14"
    },
    "autoload": {
        "psr-4": {
            "MyExample\\": "src/"
        }
    }
}

Если вы измените раздел автозагрузки, предлагаю сбросить файл автозагрузки:

composer dump-autoload

Теперь вам нужно создать шаблон/представление Twig для рендеринга данных, полученных через API.

Создайте шаблон/представление Twig для рецепта.

Затем создайте шаблон/представление Twig для отображения рецепта в формате Markdown.
Этот шаблон должен находиться в каталоге представлений (например, src/resources/view/recipe.md.twig).

# Recipe: {{ name }}

- Preparation time: {{ prepTimeMinutes }} minutes
- Cooking time {{ cookTimeMinutes }} minutes
- Difficulty level: {{ difficulty }}
- Cuisine: {{ cuisine }}
- Servings {{ servings }} people, with {{ caloriesPerServing }} calories per person

## Ingredients:

{% for ingredient in ingredients %}
- {{ ingredient }}
{% endfor %}

## Instructions:

{% for instruction in instructions %}
- {{ instruction }}
{% endfor %}

Enjoy!

Этот файл представления Twig отображает рецепт в формате Markdown с разделами для названия рецепта, ингредиентов и инструкций.

Запуск команды

Чтобы выполнить команду, выполните в терминале следующее:

php my-app

Если у вас более одной команды, вы можете запустить:

php m-app recipe

Чтобы просмотреть все доступные команды:

php my-app list

Заключение

Благодаря такому подходу вы можете легко получать данные из внешнего API с помощью HTTP-клиента Symfony, обрабатывать ответ и отображать выходные данные в структурированном формате с помощью Twig. В этом случае команда выводит рецепт в формате Markdown, но этот метод можно адаптировать к любому другому контенту или типу данных, которые вам необходимо обработать.
Наслаждайтесь рецептом!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/robertobutti/using-twig-for-rendering-markdown-with-php-2d24?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3