Класс EntityTypes является финальным классом для работы с типами сущностей в системе Ultralight CRM. Он отвечает за регистрацию новых типов сущностей, хранение их метаданных и предоставление информации о зарегистрированных типах.
App\Models\EntityTypesModel (Laravel Eloquent)final (не может быть унаследован)Класс EntityTypes предназначен для:
registerType(string $typeName, string $class, array $fields): intРегистрирует новый тип сущности в системе. В процесс регистрации входит валидация полей сущностей, внесение данных о полях и типе сущности в таблицу, создание миграции для сущности.
Параметры:
$typeName — название типа сущности$class — название класса, определяющего тип сущности с полным путем$fields — массив полей сущности вида [«имя поля» => [«тип поля», $otherParam, …]]Возвращает: Идентификатор зарегистрированного типа сущности
Исключения:
Exception — при ошибках регистрацииПример использования:
// Регистрация типа сущности "Проект"
$entityTypes = new EntityTypes();
$typeId = $entityTypes->registerType(
'Project',
'App\\Models\\Project',
[
'name' => ['CHAR', 128],
'status' => ['CHAR', 32],
'description' => ['TEXT'],
'deadline' => ['DATE'],
'budget' => ['DECIMAL', 10, 2]
]
);
// Регистрация типа сущности "Клиент"
$typeId = $entityTypes->registerType(
'Client',
'App\\Models\\Client',
[
'company_name' => ['STRING'],
'contact_person' => ['STRING'],
'phone' => ['STRING'],
'email' => ['STRING'],
'address' => ['TEXT']
]
);
getTypeInfo(int $typeId): arrayПолучает информацию о зарегистрированном типе сущности.
Параметры:
$typeId — идентификатор зарегистрированного типа сущностиВозвращает: Массив с информацией о типе
Исключения:
Exception — если тип сущности не существуетСтруктура возвращаемого массива:
[
'ENTITY_TYPE_ID' => 5,
'ENTITY_TYPE_NAME' => 'Project',
'ENTITY_CLASS_NAME' => 'App\\Models\\Project',
'ENTITY_TABLE_NAME' => 'project',
'ENTITY_FIELDS_INFO_TABLE_NAME' => 'project_fields',
'ENTITY_FIELDS_INFO' => [
'id' => ['INTEGER'],
'name' => ['CHAR', 128],
'status' => ['CHAR', 32],
'description' => ['TEXT'],
'deadline' => ['DATE'],
'budget' => ['DECIMAL', 10, 2]
]
]
Пример использования:
// Получение информации о типе сущности
$entityTypes = new EntityTypes();
$typeInfo = $entityTypes->getTypeInfo(5);
// Использование полученной информации
echo $typeInfo['ENTITY_TYPE_NAME'];
echo $typeInfo['ENTITY_TABLE_NAME'];
// Перебор полей
foreach ($typeInfo['ENTITY_FIELDS_INFO'] as $fieldName => $fieldInfo) {
echo "Поле: $fieldName, Тип: {$fieldInfo[0]}";
if (isset($fieldInfo[1])) {
echo ", Размер: {$fieldInfo[1]}";
}
echo "\n";
}
checkFieldExists(int $typeId, string $fieldName): boolПроверяет существование поля в типе.
Параметры:
$typeId — идентификатор зарегистрированного типа сущности$fieldName — название поля в сущностиВозвращает: true, если поле существует в сущности
Исключения:
Exception — если поля не существует в сущностиПример использования:
// Проверка существования поля
$entityTypes = new EntityTypes();
if ($entityTypes->checkFieldExists(5, 'name')) {
echo 'Поле name существует';
}
// Проверка несуществующего поля
try {
$entityTypes->checkFieldExists(5, 'invalid_field');
} catch (Exception $e) {
echo 'Ошибка: ' . $e->getMessage();
}
getEntityTypeIdByEntityTypeName(string $entityTypeName): intФункция возвращает идентификатор типа сущности по имени сущности.
Параметры:
$entityTypeName — имя сущностиВозвращает: Идентификатор типа сущности
Исключения:
Exception — если сущность с переданным именем не найденаПример использования:
// Получение идентификатора типа по имени
$entityTypes = new EntityTypes();
$typeId = $entityTypes->getEntityTypeIdByEntityTypeName('Project');
echo "Идентификатор типа Project: $typeId";
// Попытка получить несуществующий тип
try {
$typeId = $entityTypes->getEntityTypeIdByEntityTypeName('InvalidType');
} catch (Exception $e) {
echo 'Ошибка: ' . $e->getMessage();
}
checkTypeName(string $typeName): boolПроверяет, что имя типа является уникальным.
Параметры:
$typeName — имя типаВозвращает: true, если имя типа уникально
Исключения:
Exception — если тип сущности с переданным именем уже существуетПример использования:
// Проверка уникальности имени типа
$entityTypes = new EntityTypes();
if ($entityTypes->checkTypeName('NewProject')) {
echo 'Имя типа уникально';
// Можно регистрировать новый тип
}
checkTypeClass(string $class): boolПроверяет, что имя класса типа является уникальным.
Параметры:
$class — название класса, определяющего тип сущности с полным путемВозвращает: true, если класса типа уникально
Исключения:
Exception — если тип сущности с переданным именем класса уже существуетПример использования:
// Проверка уникальности имени класса
$entityTypes = new EntityTypes();
if ($entityTypes->checkTypeClass('App\\Models\\NewProject')) {
echo 'Имя класса уникально';
// Можно регистрировать новый тип
}
checkEntityTypeExists(int $typeId): boolПроверяет, что переданный тип сущности зарегистрирован.
Параметры:
$typeId — идентификатор типа сущностиВозвращает: true, если переданный идентификатор зарегистрирован
Исключения:
Exception — если переданный идентификатор не зарегистрированПример использования:
// Проверка существования типа
$entityTypes = new EntityTypes();
if ($entityTypes->checkEntityTypeExists(5)) {
echo 'Тип сущности существует';
}
$entityTypes = new EntityTypes();
// Определение полей для нового типа
$fields = [
'title' => ['CHAR', 255],
'content' => ['TEXT'],
'status' => ['CHAR', 20],
'priority' => ['INTEGER'],
'created_at' => ['TIMESTAMP'],
'updated_at' => ['TIMESTAMP']
];
// Регистрация типа
try {
$typeId = $entityTypes->registerType(
'Task',
'App\\Models\\Task',
$fields
);
echo "Тип сущности зарегистрирован с ID: $typeId";
// Получение информации о зарегистрированном типе
$typeInfo = $entityTypes->getTypeInfo($typeId);
print_r($typeInfo);
} catch (Exception $e) {
echo 'Ошибка регистрации типа: ' . $e->getMessage();
}
// После регистрации типа можно создавать сущности
$task = EntityTable::createEntity($typeId, [
'title' => 'Новая задача',
'content' => 'Описание задачи',
'status' => 'new',
'priority' => 1
]);
// Получение созданных сущностей
$tasks = EntityTable::getEntities([
'ENTITY_TYPE_ID' => $typeId,
'ORDER_BY' => ['priority', 'DESC']
]);
foreach ($tasks as $task) {
echo "Задача: " . $task->getField('title') . " (Статус: " . $task->getField('status') . ")\n";
}
// Получение информации о всех типах сущностей
function getAllEntityTypesInfo() {
$entityTypes = new EntityTypes();
$ids = $entityTypes->all("id");
$result = [];
foreach ($ids as $id) {
$result[] = $entityTypes->getTypeInfo($id->id);
}
return $result;
}
// Использование
$allTypes = getAllEntityTypesInfo();
foreach ($allTypes as $type) {
echo "Тип: {$type['ENTITY_TYPE_NAME']} (ID: {$type['ENTITY_TYPE_ID']})\n";
echo "Поля:\n";
foreach ($type['ENTITY_FIELDS_INFO'] as $fieldName => $fieldInfo) {
$fieldType = $fieldInfo[0];
$fieldSize = isset($fieldInfo[1]) ? "({$fieldInfo[1]})" : "";
echo " - $fieldName: $fieldType $fieldSize\n";
}
echo "\n";
}
createEntityFieldsInfoTable()createEntityMigration()private function createEntityFieldsInfoTable(string $typeName, array $fields): string {
// Создание миграции
$artisanCode = Artisan::call("make:migration", ["name" => "{$typeName}Fields"]);
// Генерация имени таблицы
$entityFieldInfoTableName = strtolower(preg_replace('/(?<!^)[A-Z]/', '_$0', "{$typeName}Fields"));
// Создание файла миграции
$migrationFile = "<?php use Illuminate