通过“使用”而非“包含”动态水平重复使用来制作树枝插件

问题描述

需要:从数据库加载的动态模板

我需要通过“模板插件”呈现一个JSON对象,该模板对象将来自数据库(在应用程序本身之外定义)。仅当插件存在时,才会应用该插件

对于此示例,假设我具有“预订”类型的该对象,其中包含“航班”类型的子对象:

{
    "id": "ABC-XYZ","reservationDate": "2020-09-23","state": "paid","flight":
    {
        "origin": "BCN","destination": "MAD","airline": "VY"
    }
}

规则

  • 控制器将调用传递多个对象的页面模板。
  • 页面模板将“使用”或“包含”(请参阅​​后面的更多信息)object.html.twig,并将其显示
  • object.html.twig将执行以下操作:
    • 如果没有任何已知的插件可以处理此类对象,则模板将显示<pre>,并将对象转换为YAML。这将主要用作“认”插件或“后备”插件
    • 如果有一个已知的插件可以处理该对象,则该对象将被发送到该插件(除了其他树枝模板之外,别无其他)。
      • 在这种情况下,该插件应该能够将“可解释”结果的“部分”分开,使其变得“不错”,并将其余部分留在一个对象中,然后该对象将再次显示为原始的“认”插件
      • 如果对象的某些部分又可以解释,那么它们将依次传递给其他插件

示例“所需”输出

示例1.没有可用的插件

No plugin available

样本2。提供插件“ reservation”。用绿色解释状态。同时删除ID的冗余数据

Reservation plugin

示例3。与2相同,但还有插件“飞行”可用,能够处理飞行块。格式化文本并查询航空公司的全名

Flight plugin

示例4.可用的插件“航班”,能够处理航班,又知道起点和目的地是“机场”,并将它们传递给相应的嵌套“机场”插件,因为它们是“可重复使用的”对象不仅在“飞行”插件中,而且在应用程序的许多其他位置中也是如此,因此它们被定义为appart

Airport plugin

我已经探索过的东西

我知道通过'include'可以做到。但是,让我们看一下“使用”和“包含”之间的区别:

在树枝中includeuse间的主要区别在于:

  • include模板中,它是直接“插入”的HTML,您可以在其中使用{{ }}运算符进行打印,并使用{% %}进行控制流(设置变量,如果,fors等)。渲染器将​​直接对其进行处理。但是禁止通过{% block myNiceBlock %}定义新的块。

  • “使用”模板时,该模板已预加载,并且允许使用块。没有渲染包含的块。然后,从调用方使用{{block('whatever'}}}告诉渲染器去渲染该特定块。

“包含”更为基本。 use允许水平重用,并允许其自身与父块调用的其他子块自动组织,全部都在一个文件中。

例如,在机场示例中,如果有N张图像,则在include中,您应该将包装器HTML直接放入文件中,进行循环并在循环内部编写内部HTML。

您将使用use块代替airport方法,该块依次循环遍历图像,并仅调用在同一文件的另一个块中定义的airportimage块,从而简化了编码。

要求

  1. 创建新插件时,不应重新部署应用程序。它们必须从数据库或任何其他动态系统中加载,因为插件将在需要时由“应用程序的用户”编写。不允许部署。
  2. 插件应使用“可阻止”的树枝模板来编写,因此需要“可用”。

问题

发现要调用的“哪个”插件不是问题。假设在此示例中,任何人(控制器,树枝本身,实际上是任何人)都可以发现某个地方存在“预订”插件。如何在页面usereservation呈现时,“询问是否有航班插件”可用。如果没有,则全部交给YAML。如果是,那么如何动态地将预订告知use航班?

简而言之:如何强制模板动态地use(不是include)模板又来自数据库(而不是来自固定文件)?

注意:如果此信息有用:我正在将Symfony 5与webpack一起使用。

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...