123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- <?php
- namespace BotKit\Tools;
- // Класс генерации исходных файлов моделей
- use BotKit\Common\Database;
- class ModelCodeGenerator {
- // Шаблон для класса
- private static string $class_template =
- '<?php
- namespace BotKit\Models;
- class %sModel extends Model {
- use %s;
- protected static $allowed_columns = ["*"];
- }';
- // Шаблон для трейта
- private static string $trait_template =
- '<?php
- // Внимание! При повторном выполнении скрипта генерации моделей этот файл будет ПЕРЕЗАПИСАН
- // Прописывайте бизнес-логику в классах, а не в трейтах
- namespace BotKit\Models;
- use BotKit\Common\Database;
- trait %s {
- protected static string $table_name = "%s";
- // Пояснения колонок:
- %s
- public static function create(%s) {
- $db = Database::getConnection();
- $statement = $db->prepare(
- "INSERT INTO %s (%s) VALUES (%s)"
- );
- %s
- $statement->execute();
- return $db->query("SELECT ".static::allowedColumnsSQL()." FROM %s WHERE id=".$db->lastInsertId())->fetch();
- }
- public static function updateObject($object) {
- $db = Database::getConnection();
- $statement = $db->prepare(
- "UPDATE %s SET %s WHERE id=:id"
- );
- $statement->bindValue(":id", $object["id"]);
- %s
- $statement->execute();
- }
- }';
- // Запускает процесс генерации
- public static function run(string $user, string $password, string $db_name) : void {
- // Получение информации о таблицах и колонках
- Database::init(
- 'localhost',
- 'information_schema',
- $user,
- $password
- );
- $db = Database::getConnection();
- // Запрос на получение всех таблиц в БД
- $all_tables = $db->prepare(
- "SELECT `TABLE_NAME` FROM `TABLES`
- WHERE `TABLE_SCHEMA`=:table_schema"
- );
- // Запрос на получение всех колонок таблицы
- $all_columns = $db->prepare(
- "SELECT `COLUMN_NAME`, `COLUMN_COMMENT`, `COLUMN_KEY`, `IS_NULLABLE`
- FROM `COLUMNS`
- WHERE `TABLE_SCHEMA`=:table_schema AND `TABLE_NAME`=:table_name
- ORDER BY `ORDINAL_POSITION`"
- );
- // Привязка данных
- $all_tables->bindValue(':table_schema', $db_name);
- $all_columns->bindValue(':table_schema', $db_name);
- $all_columns->bindParam(':table_name', $table_name);
- // Сбор таблиц
- $all_tables->execute();
- $tables = [];
- while (($row_table = $all_tables->fetch()) !== false) {
- $table_name = $row_table['TABLE_NAME'];
- $all_columns->execute();
- // Сбор всех колонок таблицы
- $table_columns = [];
- while (($row_table_columns = $all_columns->fetch()) !== false) {
- $table_columns[] = new ModelGeneratorColumn(
- $row_table_columns['COLUMN_NAME'],
- $row_table_columns['COLUMN_KEY'] === 'PRI',
- $row_table_columns['COLUMN_COMMENT'],
- $row_table_columns['IS_NULLABLE'] === 'YES'
- );
- }
- // Добавление таблицы в массив
- $tables[] = new ModelGeneratorTable($table_name, $table_columns);
- }
- // Генерация кода
- define('models_dir', rootdir.'src/Models/');
- foreach ($tables as $table) {
- echo "===Создание файлов для таблицы: ".$table->getName()."===\n";
- $class_filename = models_dir.$table->getClassFileName();
- $trait_filename = models_dir.$table->getTraitFileName();
- if (file_exists($class_filename)) {
- echo "- Класс уже существует и не будет перезаписан\n";
- } else {
- $fp = fopen($class_filename, 'w');
- fwrite($fp, $table->getClassCode(self::$class_template));
- fclose($fp);
- echo "- Класс сгенерирован\n";
- }
- $fp = fopen($trait_filename, 'w');
- fwrite($fp, $table->getTraitCode(self::$trait_template));
- fclose($fp);
- echo "- Трейт сгенерирован\n";
- echo "Успешно сгенерировано\n\n";
- }
- }
- }
|