SVSP
TECHNOLOGIES

Документация

EntityTypes

Общее описание

Класс EntityTypes является финальным классом для работы с типами сущностей в системе Ultralight CRM. Он отвечает за регистрацию новых типов сущностей, хранение их метаданных и предоставление информации о зарегистрированных типах.

Основная информация

Назначение

Класс EntityTypes предназначен для:

Методы

registerType(string $typeName, string $class, array $fields): int

Регистрирует новый тип сущности в системе. В процесс регистрации входит валидация полей сущностей, внесение данных о полях и типе сущности в таблицу, создание миграции для сущности.

Параметры:

Возвращает: Идентификатор зарегистрированного типа сущности

Исключения:

Пример использования:

// Регистрация типа сущности "Проект"
$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

Получает информацию о зарегистрированном типе сущности.

Параметры:

Возвращает: Массив с информацией о типе

Исключения:

Структура возвращаемого массива:

[
'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

Проверяет существование поля в типе.

Параметры:

Возвращает: true, если поле существует в сущности

Исключения:

Пример использования:

// Проверка существования поля
$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

Функция возвращает идентификатор типа сущности по имени сущности.

Параметры:

Возвращает: Идентификатор типа сущности

Исключения:

Пример использования:

// Получение идентификатора типа по имени
$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

Проверяет, что имя типа является уникальным.

Параметры:

Возвращает: true, если имя типа уникально

Исключения:

Пример использования:

// Проверка уникальности имени типа
$entityTypes = new EntityTypes();

if ($entityTypes->checkTypeName('NewProject')) {
echo 'Имя типа уникально';
// Можно регистрировать новый тип
}

checkTypeClass(string $class): bool

Проверяет, что имя класса типа является уникальным.

Параметры:

Возвращает: true, если класса типа уникально

Исключения:

Пример использования:

// Проверка уникальности имени класса
$entityTypes = new EntityTypes();

if ($entityTypes->checkTypeClass('App\\Models\\NewProject')) {
echo 'Имя класса уникально';
// Можно регистрировать новый тип
}

checkEntityTypeExists(int $typeId): bool

Проверяет, что переданный тип сущности зарегистрирован.

Параметры:

Возвращает: true, если переданный идентификатор зарегистрирован

Исключения:

Пример использования:

// Проверка существования типа
$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";
}

Механизм работы

Процесс регистрации типа

  1. Проверка уникальности — имени типа и имени класса
  2. Создание таблицы для информации о полях — createEntityFieldsInfoTable()
  3. Создание миграции для сущности — createEntityMigration()
  4. Регистрация типа в таблице entity_types

Создание таблицы для информации о полях

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
SVSP
TECHNOLOGIES
Политика конфиденциальности
Политика конфиденциальности