【问题标题】:Populate twig template from external api从外部 api 填充树枝模板
【发布时间】:2016-06-09 04:39:10
【问题描述】:

我正在构建一个 Drupal 8 站点,并且是 Twig 模板引擎的新手。对于一种特定的内容类型,我想调用一个外部的 restful api,并将一些返回的数据呈现为 twig 模板中的字段。

我有一个内部 id 来调用 API,我想嵌入到模板中:

  • api调用
  • 从调用中设置多个变量
  • 渲染结果(如果不存在,则使用一些逻辑)

这是用 twig 和 drupal 8 很容易做到的事情吗? 作为次要问题,这是否安全?

现阶段的替代方案是编写小的 Drupal 8 模块,但由于页面上没有用户输入,只是从返回的 api 调用中呈现,我认为将它们全部放在一个地方会更容易。

【问题讨论】:

  • Twig 只是模板引擎,它不关心数据来自哪里。它只负责输出...所以如果您的问题是 twig 是否可以做到这一点,那么可以。
  • 你是说我可以在模板中间转储一个 php 调用吗?那安全吗?那实际上会是什么样子?
  • 如果您想从内部进行 API 调用,您需要 extend twig 并创建一个从 API 检索数据的函数

标签: symfony templates drupal twig drupal-8


【解决方案1】:

在 Drupal 7 中,可以将任意 PHP 放入模板中,但设计不佳。在 Drupal 8 中,故意很难做到这一点。您不应尝试在 Twig 文件中执行任意 PHP 或在请求处理后期进行远程 API 调用。

您应该在到达树枝之前调用 API 并收集数据。您应该创建一个自定义模块来处理该 API 交互并将响应放置在字段、块或其他结构中以在适当的上下文中呈现(通常自定义块适用于这样的事情,但究竟哪种方法最有意义取决于您的项目)。您还应该记住,任何需要远程 API 调用的页面都可能很慢,除非该 API 调用非常简单且非常非常快。 BigPipe 模块可以帮助您解决这类速度问题,但需要额外的学习曲线。

如果您希望浏览器处理 API 调用,您需要创建一个 div(或类似标记)来放置结果,并将 JavaScript 附加到结构并在大部分页面加载后进行实际的 API 调用完成了。

至于安全性:它与您所做的一样安全。 Drupal 将提供一些帮助来避免最常见的安全错误,但您仍然可以做一些使其不安全的事情(例如与不受信任的第三方共享数据或假设响应数据始终是安全的)。

【讨论】:

  • 我接受这不是最佳做法。在这种特殊情况下,我们同时控制站点和 API,并且我们最多检索 100 个字符的内容来填充几个字段。由于没有用户交互并且内容很少,我过去只是在模板中插入一些 PHP 来进行所需的 API 调用。 twig 似乎更加锁定了它,所以我可能会听从你的建议并创建一个模块来完成这项工作。看起来只有很多代码,内容很少。
猜你喜欢
  • 2012-07-27
  • 2017-12-06
  • 2016-05-17
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多