【问题标题】:PHP Code generator based on templates基于模板的 PHP 代码生成器
【发布时间】: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 模板的代码生成器吗?请分享

标签: php regex code-generation scaffolding


【解决方案1】:

我建议您使用 gui 界面代替 cli 界面。因为这样更容易定制。

作为参考,您可以使用 Yeoman 一个大型的脚手架工具,有据可查,它可以帮助您更轻松地构建生成器。 http://yeoman.io/

为了获得灵感,请看一下这个生成器演示: https://github.com/DaftMonk/generator-angular-fullstack

【讨论】:

  • 我以前一直在研究这个。我离开的原因是我想要一个基于 GUI,这样我就可以从任何地方(从共享主机等)生成它,这与 Yeoman 不同。
  • 希望您可以自己生成,然后再部署。
  • 我正在考虑使用 #twig 模板。
猜你喜欢
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多