Генератор PHP-кода на основе шаблонов

1

Я хочу создать код на основе шаблонов.

Предположим, что в /Templates меня есть файлы, структурированные как:

/Templates
  • Производитель /Plugin/config.xml
  • Производитель/Plugin/Модель/plugin.php
  • Производитель /Plugin/View/plugin.phtml

И скажем, что файлы имеют следующее содержимое (переменные, заключенные в {{ }} должны быть проанализированы):

Производитель /Plugin/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/Модель/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/View/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, которая позволит пользователям добавлять по крайней мере следующие поля

Поставщик: Плагин: Версия: Автор:

Имеет таблицы?: Если выбрано yes, это позволит пользователям добавлять больше полей, таких как имя таблицы, поля и т.д.

2> При отправке формы он генерирует код из папки /Templates в какой-то каталог. Логика может быть: Подготовка переменных для подачи в CoreGenerator (класс, который должен быть разработан), который будет считывать все файлы шаблонов и повторно генерировать их анализируя эти переменные.

Ожидаемый результат из /Template будет: (Предположим, если у нас есть следующие валиды от ввода пользователя

Vendor: Foo
Plugin: Bar
Version: 1.0.0
Author: John Doe <[email protected]>
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/бар/config.xml
  • Foo/Бар/Модель/Bar.php
  • Foo/Bar/View/bar.phtml <- обратите внимание на чувствительность к регистру)

Сгенерированное содержимое:

Foo/бар/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.php:

<?php

/**
 * @category Foo_Bar
 * @author  John Doe <[email protected]>
 */
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/Бар/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>

Поэтому моя основная задача будет заключаться в классе/библиотеке Code Generator, который будет собирать значения заполнителя из пользовательского ввода, читать все эти файлы из папки /Templates и регенерировать их после разбора этих переменных (простых, условных, циклов и т.д.) В /Generated папка,

С какой информацией я могу начать, с чего начать? любая грубая идея, решения и ссылки заслуживают высокой оценки. Заранее спасибо.

Теги:
code-generation
scaffolding

1 ответ

1

Я бы предположил, что вместо этого вы используете интерфейс gui для интерфейса cli. Потому что таким образом легче настраивать.

В качестве справочной информации вы можете использовать Yeoman большой инструмент для строительных лесов, хорошо документированный, который может помочь вам построить генератор с меньшими усилиями. http://yeoman.io/

Для вдохновения ознакомьтесь с этой демо-версией генератора: https://github.com/DaftMonk/generator-angular-fullstack

  • 0
    Я изучал это раньше. Причина, по которой я ушел, в том, что я хотел использовать графический интерфейс, чтобы я мог генерировать его из любого места (с общего хостинга и т. Д.), В отличие от Yeoman.
  • 0
    Можете ли вы создать свой собственный файл, а затем развернуть его позже.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню