ModelCodeGenerator.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. namespace BotKit\Tools;
  3. // Класс генерации исходных файлов моделей
  4. use BotKit\Common\Database;
  5. class ModelCodeGenerator {
  6. // Шаблон для класса
  7. private static string $class_template =
  8. '<?php
  9. namespace BotKit\Models;
  10. class %sModel extends Model {
  11. use %s;
  12. protected static $allowed_columns = ["*"];
  13. }';
  14. // Шаблон для трейта
  15. private static string $trait_template =
  16. '<?php
  17. // Внимание! При повторном выполнении скрипта генерации моделей этот файл будет ПЕРЕЗАПИСАН
  18. // Прописывайте бизнес-логику в классах, а не в трейтах
  19. namespace BotKit\Models;
  20. use BotKit\Common\Database;
  21. trait %s {
  22. protected static string $table_name = "%s";
  23. // Пояснения колонок:
  24. %s
  25. public static function create(%s) {
  26. $db = Database::getConnection();
  27. $statement = $db->prepare(
  28. "INSERT INTO %s (%s) VALUES (%s)"
  29. );
  30. %s
  31. $statement->execute();
  32. return $db->query("SELECT ".static::allowedColumnsSQL()." FROM %s WHERE id=".$db->lastInsertId())->fetch();
  33. }
  34. public static function updateObject($object) {
  35. $db = Database::getConnection();
  36. $statement = $db->prepare(
  37. "UPDATE %s SET %s WHERE id=:id"
  38. );
  39. $statement->bindValue(":id", $object["id"]);
  40. %s
  41. $statement->execute();
  42. }
  43. }';
  44. // Запускает процесс генерации
  45. public static function run(string $user, string $password, string $db_name) : void {
  46. // Получение информации о таблицах и колонках
  47. Database::init(
  48. 'localhost',
  49. 'information_schema',
  50. $user,
  51. $password
  52. );
  53. $db = Database::getConnection();
  54. // Запрос на получение всех таблиц в БД
  55. $all_tables = $db->prepare(
  56. "SELECT `TABLE_NAME` FROM `TABLES`
  57. WHERE `TABLE_SCHEMA`=:table_schema"
  58. );
  59. // Запрос на получение всех колонок таблицы
  60. $all_columns = $db->prepare(
  61. "SELECT `COLUMN_NAME`, `COLUMN_COMMENT`, `COLUMN_KEY`, `IS_NULLABLE`
  62. FROM `COLUMNS`
  63. WHERE `TABLE_SCHEMA`=:table_schema AND `TABLE_NAME`=:table_name
  64. ORDER BY `ORDINAL_POSITION`"
  65. );
  66. // Привязка данных
  67. $all_tables->bindValue(':table_schema', $db_name);
  68. $all_columns->bindValue(':table_schema', $db_name);
  69. $all_columns->bindParam(':table_name', $table_name);
  70. // Сбор таблиц
  71. $all_tables->execute();
  72. $tables = [];
  73. while (($row_table = $all_tables->fetch()) !== false) {
  74. $table_name = $row_table['TABLE_NAME'];
  75. $all_columns->execute();
  76. // Сбор всех колонок таблицы
  77. $table_columns = [];
  78. while (($row_table_columns = $all_columns->fetch()) !== false) {
  79. $table_columns[] = new ModelGeneratorColumn(
  80. $row_table_columns['COLUMN_NAME'],
  81. $row_table_columns['COLUMN_KEY'] === 'PRI',
  82. $row_table_columns['COLUMN_COMMENT'],
  83. $row_table_columns['IS_NULLABLE'] === 'YES'
  84. );
  85. }
  86. // Добавление таблицы в массив
  87. $tables[] = new ModelGeneratorTable($table_name, $table_columns);
  88. }
  89. // Генерация кода
  90. define('models_dir', rootdir.'src/Models/');
  91. foreach ($tables as $table) {
  92. echo "===Создание файлов для таблицы: ".$table->getName()."===\n";
  93. $class_filename = models_dir.$table->getClassFileName();
  94. $trait_filename = models_dir.$table->getTraitFileName();
  95. if (file_exists($class_filename)) {
  96. echo "- Класс уже существует и не будет перезаписан\n";
  97. } else {
  98. $fp = fopen($class_filename, 'w');
  99. fwrite($fp, $table->getClassCode(self::$class_template));
  100. fclose($fp);
  101. echo "- Класс сгенерирован\n";
  102. }
  103. $fp = fopen($trait_filename, 'w');
  104. fwrite($fp, $table->getTraitCode(self::$trait_template));
  105. fclose($fp);
  106. echo "- Трейт сгенерирован\n";
  107. echo "Успешно сгенерировано\n\n";
  108. }
  109. }
  110. }