使用 Twig 通过 PHP 渲染 Markdown

使用 twig 通过 php 渲染 markdown

twig 是使用 symfony 开发 web 应用程序时渲染 html 的首选模板引擎。
然而,twig 的灵活性不仅仅限于生成 html 页面。它可以成为跨多个渠道交付内容的强大工具,例如生成 markdown 文件、json 输出,甚至纯文本,所有这些都来自同一组内容。

这种适应性使您可以为不同的频道创建内容。

您可以使用 twig 生成 html、markdown、json、文本等

用例:使用 symfony 获取并渲染配方为 markdown

在此示例中,我们使用 symfony http 客户端从外部 api (https://dummyjson.com/recipes/1) 获取配方,并使用 twig 将其呈现为 markdown 文档。
这种方法展示了如何结合 symfony 强大的软件包(例如用于外部数据检索的 symfony http 客户端和用于渲染视图的 twig)来跨多个渠道交付内容,例如命令行工具中的 markdown 报告。

我们要构建的命令/脚本从 api 中获取食谱数据(标题、描述、成分和说明),对其进行处理,然后使用 twig 以结构化 markdown 格式输出内容。这个实际用例说明了如何在 web 模板之外使用 twig,使其能够生成各种格式的内容。

所以,我们将使用:

  • symfony console 用于构建命令行工具的组件 https://symfony.com/doc/current/components/console.html
  • symfony http 客户端 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 并将其转换为 markdown 文件的过程.

安装必要的 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):

<?php namespace myexample\commands;

use symfony\component\console\command\command;
use symfony\component\console\input\inputinterface;
use symfony\component\console\output\outputinterface;
use symfony\component\httpclient\httpclient;


class fetchrecipecommand extends command
{

    private $twig;

    public function __construct()
    {
        $this
            ->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环境

要在典型的 web 上下文之外使用 twig,例如在 php 命令行工具中,首先需要通过 twigenvironment 类手动初始化它。以下是控制台命令中 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 来初始化的,该 filesystemloader 告诉 twig 在哪里可以找到模板。本例指向存储 twig 模板的 src/resources/views 文件夹。
  • 然后,$twig 环境被实例化并负责渲染模板。可以启用可选缓存,通过存储预编译模板来提高性能。
  • 最后将初始化的$twig环境赋值给$this->twig以供后续使用(在execute()方法中)。

第 2 步:初始化 http 客户端并获取配方

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

说明:

  • symfony http 客户端是使用 httpclient::create() 方法创建的,该方法允许命令执行 http 请求。
  • 要获取菜谱,request() 方法会对指定的 url (https://dummyjson.com/recipes/1) 执行 get 请求。
  • api 返回存储在 $response 变量中的 json 响应。

第三步:获取信息数组

$recipedata = $response->toarray();

说明:

  • toarray() 方法将 api 的 json 响应转换为 php 数组。该数组包含食谱的数据(例如名称、成分、说明),这些数据将用于在下一步中填充 twig 模板。

第四步:使用twig渲染模板

$markdownoutput = $this->twig->render('recipe.md.twig', $recipedata);

说明:

  • twig 环境的 render() 方法生成 markdown 输出。它从 src/resources/views 文件夹加载模板 (recipe.md.twig)。
  • 从 api 获取的菜谱数据 ($recipedata) 被传递到模板中,它将替换菜谱名称、成分和说明等占位符,创建一个完全格式化的 markdown 文件。
  • 渲染后的 markdown 内容(render() 方法返回的字符串)存储在 $markdownoutput 变量中。

第 5 步:为生成的 markdown 生成输出

$output->writeln($markdownoutput);

说明:

  • 最终的 markdown 内容使用 $output->writeln() 方法打印到控制台。该方法将字符串输出到控制台,允许用户以 markdown 格式查看格式化的菜谱(最终,您可以将输出重定向到 shell 中的文件中)。

创建启动文件

您必须创建一个启动文件以允许用户直接从 shell 启动您的 symfony 命令。 (在本文中,我们不是创建 symfony 应用程序;我们正在使用 symfony 包构建 php 脚本。)
在项目目录中,您有composer.json文件和src目录,您可以创建一个my-app文件。

#!/usr/bin/env php
<?php use myexample\commands\fetchrecipecommand;
use symfony\component\console\application;

if (file_exists(__dir__ . '/../../autoload.php')) {
    require __dir__ . '/../../autoload.php';
} else {
    require __dir__ . '/vendor/autoload.php';
}

/**
 * start the console application.
 */
$app = new application('recipe to markdown', '1.0.0');
$app->setdefaultcommand("recipe");

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


$app->run();

要正确使用命名空间和类,请务必在composer.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

结论

通过这种方法,您可以使用 symfony http 客户端轻松地从外部 api 检索数据、处理响应并使用 twig 以结构化格式呈现输出。在本例中,该命令将配方输出为 markdown,但此技术可以适用于您需要处理的任何其他内容或数据类型。
享受你的食谱!

以上就是使用 Twig 通过 PHP 渲染 Markdown的详细内容,更多请关注其它相关文章!