基于模板的 PHP 代码生成器
Posted
技术标签:
【中文标题】基于模板的 PHP 代码生成器【英文标题】:PHP Code generator based on templates 【发布时间】:2016-02-01 10:16:57 【问题描述】:我想根据模板生成代码。
假设在/Templates
我的文件结构如下:
/Templates
供应商/插件/config.xml
供应商/插件/模型/Plugin.php
供应商/插件/视图/plugin.phtml
并说文件有以下内容(
括起来的变量需要解析):
供应商/插件/config.xml:
<?xml version="1.0"?>
<config>
<module>Vendor/Plugin</module>
<version>Version</version>
if $HasTable
<database>
<table>TableName</table>
<pk>PrimaryKey</pk>
<fields>
foreach $Fields
<field>
<name>Fields.Name</name>
<label>Fields.Label</label>
<type>Fields.Type</type>
</field>
/foreach
</fields>
</database>
/if
</config>
供应商/插件/模型/Plugin.php:
<?php
/**
* @category Vendor_Plugin
* @author Author
*/
class Vendor_Plugin_Model_Plugin extends Core_Model_Abstract
public function __construct()
parent::__construct();
if $HasTable
public function setTable()
$this->_tableName = 'TableName';
public function setPrimaryKey()
$this->_primaryKey = 'PrimaryKey';
public function setFields()
$this->_fields = Core::Config('database/table/fields');
/if
供应商/插件/视图/plugin.phtml:
TableName Rows
<table>
<tr>
foreach $Fields
<th>$Fields.Label</th>
/foreach
</tr>
<?php foreach ($data as $_data) ?>
<tr>
foreach $Fields
<td><?php echo $_data['$Fields.Name'] ?></td>
/foreach
</tr>
<?php endforeach; ?>
</table>
代码生成器应该如何工作?
1> 允许用户添加至少以下字段的 GUI 表单
供应商: 插入: 版本: 作者:
有桌子吗?: 如果选择是,它将允许用户添加更多字段,如表名、字段等。
2> 在提交表单时,它会从 /Templates 文件夹生成代码到某个目录 逻辑可以是: 准备要馈送到 CoreGenerator(要开发的类)的变量,它将读取所有模板文件并通过解析这些变量重新生成它们。
/Template
的预期输出将是:
(假设我们有来自用户输入的以下值
Vendor: Foo
Plugin: Bar
Version: 1.0.0
Author: John Doe <john.doe@example.com>
Has Tables?: Yes
Table Name: blog
Primary Key: blog_id
Fields:
+ Name: title, Label: Title, Type: Text
+ Name: status, Label: Status, Type:Int
...
)
/Generated
Foo/Bar/config.xml
Foo/Bar/Model/Bar.php
Foo/Bar/View/bar.phtml
生成的内容:
Foo/Bar/config.xml:
<?xml version="1.0"?>
<config>
<module>Foo/Bar</module>
<version>1.0.0</version>
<database>
<table>blog</table>
<pk>blog_id</pk>
<fields>
<field>
<name>title</name>
<label>Title</label>
<type>Text</type>
</field>
<field>
<name>status</name>
<label>Status</label>
<type>Int</type>
</field>
<!--... -->
</fields>
</database>
</config>
Foo/Bar/Model/Bar.php:
<?php
/**
* @category Foo_Bar
* @author John Doe <john.doe@example.com>
*/
class Foo_Bar_Model_Bar extends Core_Model_Abstract
public function __construct()
parent::__construct();
public function setTable()
$this->_tableName = 'blog';
public function setPrimaryKey()
$this->_primaryKey = 'blog_id';
public function setFields()
$this->_fields = Core::Config('database/table/fields');
Foo/Bar/View/bar.phtml:
blog Rows
<table>
<tr>
<th>Title</th>
<th>Status</th>
</tr>
<?php foreach ($data as $_data) ?>
<tr>
<td><?php echo $_data['title'] ?></td>
<td><?php echo $_data['status'] ?></td>
</tr>
<?php endforeach; ?>
</table>
所以我主要关心的是代码生成器类/库,它将从用户输入中收集占位符值,从/Templates
文件夹中读取所有这些文件,并在解析这些变量(简单、条件、循环等)后重新生成它们到/Generated
文件夹。
对此有任何见解,我应该如何开始?任何粗略的想法,解决方案和参考都受到高度赞赏。 提前致谢。
【问题讨论】:
有人有基于 Symfony 的 twig 模板的代码生成器吗?请分享 【参考方案1】:我建议您使用 gui 界面代替 cli 界面。因为这样更容易定制。
作为参考,您可以使用 Yeoman 一个大型的脚手架工具,有据可查,它可以帮助您更轻松地构建生成器。 http://yeoman.io/
为了获得灵感,请看一下这个生成器演示: https://github.com/DaftMonk/generator-angular-fullstack
【讨论】:
我以前一直在研究这个。我离开的原因是我想要一个基于 GUI,这样我就可以从任何地方(从共享主机等)生成它,这与 Yeoman 不同。 希望您可以自己生成,然后再部署。 我正在考虑使用 #twig 模板。以上是关于基于模板的 PHP 代码生成器的主要内容,如果未能解决你的问题,请参考以下文章
一套基于SpringBoot+Vue+Shiro 前后端分离 开发的代码生成器
还在写CURD?试试这款基于mybatis-plus的springboot代码生成器
推荐一个基于SpringBoot + MyBatis + Vue 的代码生成器