Plugins 通过“动态水平重用”创建细枝插件;使用「;(不包括在内) 需要:从数据库加载的动态模板

Plugins 通过“动态水平重用”创建细枝插件;使用「;(不包括在内) 需要:从数据库加载的动态模板,plugins,twig,user-defined-functions,dynamic-content,twig-extension,Plugins,Twig,User Defined Functions,Dynamic Content,Twig Extension,我需要通过“模板插件”提供一个JSON对象,该插件将来自一个数据库(在应用程序本身之外定义)。只有存在插件时,才会应用该插件 在本例中,假设我有一个“Reservation”类型的对象,其中包含一个“Flight”类型的子对象: 规则 控制器将调用传递多个对象的页面模板 页面模板将“使用”或“包括”(参见后面的更多信息)一个object.html.twig,并将显示它 object.html.twig将执行以下操作: 如果没有任何已知的插件能够处理这种类型的对象,模板将显示一个,并将对象转换

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

在本例中,假设我有一个“Reservation”类型的对象,其中包含一个“Flight”类型的子对象:

规则
  • 控制器将调用传递多个对象的页面模板
  • 页面模板将“使用”或“包括”(参见后面的更多信息)一个
    object.html.twig
    ,并将显示它
  • object.html.twig
    将执行以下操作:
    • 如果没有任何已知的插件能够处理这种类型的对象,模板将显示一个
      ,并将对象转换为YAML。这将主要作为一个“默认”插件或“回退”插件
    • 如果有一个已知的插件能够处理该对象,那么该对象将被发送到该插件(除了另一个细枝模板之外,它不是别的)。
      • 在这种情况下,插件应该能够分离“可解释”结果的“部分”,使其“良好”,并将其余部分保留在一个对象中,该对象将与原始的“默认”插件一起再次显示
      • 如果对象的某些部分依次是可解释的,那么它们将依次传递给其他插件
“期望”输出示例 样本1。没有可用的插件

样本2。插件“预订”可用。用绿色诠释国家。还将删除ID的冗余数据

样本3。与2相同,但也提供插件“flight”,能够处理flight块。格式化文本并查找航空公司全名

样本4。插件“flight”可用,能够处理航班,这反过来又知道始发地和目的地是“airport”,并将它们传递到相应的嵌套“airport”插件中,因为它们不仅在“flight”插件中是“可重用”对象,而且在应用程序中的许多其他位置也是如此,因此它们被定义为appart

我已经探索过的 我知道通过“包含”来实现这一点是可行的。但是让我们来看看“使用”和“包含”的区别:

twig中的
include
use
之间的主要区别在于:

  • 当您
    包含
    一个模板时,它是直接的HTML“插入到那里”,在那里您可以使用
    {{}
    操作符进行打印,
    {%}
    进行控制流(设置变量、ifs、fors等)。渲染器将直接对其进行处理。但是禁止通过
    {%block myNiceBlock%}
    定义新块

  • 当您“使用”模板时,它是预加载的,并且允许使用块。没有包含块的渲染。然后,从调用者处,使用{{block('whatever')}}命令渲染器转到并渲染该特定块

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

例如,在airports示例中,如果有N个图像,则在
include
中,您应该将包装器HTML直接放在文件中,执行一个循环,然后在循环中写入内部HTML

相反,在
使用
方法中,您将执行一个
airport
块,该块依次在图像上循环,并仅调用在同一文件的另一个块中定义的块
airportImage
,从而促进干净的编码

要求
  • 创建新插件时不应重新部署应用程序。它们必须从DB或任何其他动态系统加载,因为插件将由“应用程序用户”根据需要编写。不允许部署
  • 插件应该用一个“可阻塞”的小树枝模板来编写,所以需要是“可使用”的
  • 问题: 发现要调用的“哪个”插件不是问题。假设任何人(控制器、细枝本身、任何真正的人)都可以在本例中发现某个地方存在“保留”插件。如何从页面中使用它?当
    预订
    呈现时,“询问航班插件是否可用”。如果没有,则全部提交给YAML。如果是,那么如何动态地告诉预订使用航班

    简而言之:如何强制模板动态地
    使用
    (而不是
    包含
    )来自数据库(而不是固定文件)的模板

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


    谢谢

    使用
    是什么意思?创建新插件时不应重新部署应用程序
    ?从您的文本来看,插件由一个小树枝模板组成。当添加新的细枝模板时,或者您正在尝试将细枝模板存储在数据库中时,您如何不重新部署应用程序?正确(回答多个注释):同样,我们不会在代理“创建新保留”时部署应用程序,有一个创建它的POST页面和一个查看它的GET页面,我的问题的全部要点是,如果他们对对象的显示方式不满意,他们可以在表单的textarea中发布一个新的“twig语法文本”,并给它某种名称,然后将对象发送给渲染器,在数据上执行“选择”,在可用插件上执行另一个“选择”。“页面”和“主对象渲染器”它们实际上在应用程序中(因为它们不会更改)。问题是:如果它是关于“内联”内容的,我可以创建一个TwigExtension,并在任何给定的点上执行类似的操作:
    {{my_plugin_engine(var_with_plugin_name,var_with_plugin_data)}}
    ,但这更像是
    include
    的事情。我想做一些更像
    {%myu插件的事情
    
    {
        "id": "ABC-XYZ",
        "reservationDate": "2020-09-23",
        "state": "paid",
        "flight":
        {
            "origin": "BCN",
            "destination": "MAD",
            "airline": "VY"
        }
    }