PHP:从抽象生成代码(xml、json、数据库,...)

Posted

技术标签:

【中文标题】PHP:从抽象生成代码(xml、json、数据库,...)【英文标题】:PHP: Generate code from abstraction (xml, json, data base, ...) 【发布时间】:2014-10-19 17:52:12 【问题描述】:

注意请随意提出一个更好的标题,因为我认为“生成代码”和“抽象”可能不是我想问的最佳表达方式 :)

我正在寻找一种良好的模式/标准方式来从某种抽象层生成 php 代码。

示例

我已经构建了一组充当文本处理过滤器的类。这些过滤器可以链接在一起以将一些输入文本转换为一些其他输出文本,例如

Input "Hello 'CRUEL' World" 
>> RegexFilter('(.*?)') [extract everything between '']
>> ToLowerFilter [lowercase the extracted text]
Output: cruel

结果代码

对应的源代码如下所示:

$input = "Hello 'CRUEL' world";
$pattern = "#(.*?)#";
$first = new RegexFilter($pattern);
$second = new ToLowerFilter();
$first->setNextFilter($second);
$ouput = $first->Transform($input);
echo $output; // cruel

我想创建某种抽象层,以便最终用户(非程序员)无需自己编写代码即可构建自己的过滤器链。 “抽象”是指像 XML、JSON、存储在数据库等中的东西。

XML 示例(建议)

<filters>
 <filter name='Regex'>
  <properties>
   <property name='pattern'>'(.*)'</property>
  </properties>
  <nextfilter name='ToLower'>
   <properties/>
  </filter>
 </filter>
</filters> 

备注:例子很简单。想想更高级的东西,比如“复杂对象作为过滤器的属性”、“过滤器的继承”(上面的过滤器可以得到名称“RegexToLowerFilter”并且可以被其他过滤器引用)等等。

方法/想法

有解决此类问题的标准方法吗?到目前为止,我已经考虑为每个过滤器构建自定义 XML、JSON 等序列化器/反序列化器,但这似乎需要做很多工作并且可能容易出错,因为它是为每个过滤器单独完成的。此外,我想这将需要使 每个可能的依赖项 也以相同的方式可序列化 - 这在使用第三方库时可能会出现问题(例如 JsonPath)。

我想最优雅的方式是创建Domain Specific Language。不幸的是,构建编译器并不是最简单的任务,而且可能并不总是适合该领域的每个问题。 (再一次,请随时纠正我:))

TL;DR

我正在寻找一种合适的方式/模式来在(非程序员)最终用户和我的源代码之间建立一个抽象层。解决方案应该采取“简化”的抽象并“生成”相应的代码。

【问题讨论】:

...所以您想让非程序员能够在您的服务器上生成自己的代码? 只对预定义类的一个子集 - 使用一些简化的格式(不是“真正的”代码) 【参考方案1】:

您正在尝试做的事情称为“模型驱动开发”

看看 Eclipse 模型到文本 (M2T) 项目中的各种开源子项目。我最喜欢的是 JET,但还有其他的具有不同的规范和运行时特性。

尽管我非常喜欢使用模型驱动开发来解决这些一般问题,但我想提醒您注意使用这些技术(或您自己的实现)来解决这个特定问题。如果您的目标受众真的是一群非程序员,那么他们在学习您的 DSL(语法和关键字)时会遇到与您试图隐藏的原始语言一样的麻烦。如果有原始语言的开发工具(调试器、编辑器等),则比较(DSL 与原始语言)会变得更糟。模型驱动技术在应用于需要自动化工作的更多专家开发人员时往往比应用于寻求奇迹的不专业开发人员时更成功。

【讨论】:

在最好的情况下,用户甚至不必看到任何代码/xml/json/等。整个过程应该是这样的:用户可以在 UI 上拖放过滤器并将他的“模型”以 XML/JSON/保存到数据库中。我的“框架”将其拾取并计算出如何从中生成相应的代码。这有意义吗?

以上是关于PHP:从抽象生成代码(xml、json、数据库,...)的主要内容,如果未能解决你的问题,请参考以下文章

PHP接口数据的封装XML和JSON(转)

生成将使用 XMLWriter 生成目标 XML 的 PHP 代码

如何从 PHP 中获取远程 JSON 或 XML API 数据并将返回对象分配为 PHP 变量?

PHP生成和获取XML格式数据

PHP开发APP接口

我可以从类似于 jaxb 的 json 数据创建类吗