regex — генератор кода PHP на основе шаблонов

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

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

Производитель:
Плагин:
Версия:
Автор:

Есть таблицы ?:
Если выбрано значение «да», пользователи смогут добавлять дополнительные поля, такие как имя таблицы, ее поля и т. Д.

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 / Бар / 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 папка.

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

1

Решение

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]