Modelo dinámico
El motor de modelos dinámicos es el núcleo de la plataforma low-code de Doggy. Mediante la anotación @Ef combinada con los Attributes de PHP 8 para marcar los campos de negocio, genera automáticamente migraciones de base de datos, API y la interfaz de administración.
Descripción general
El sistema de modelos dinámicos se basa en dos anotaciones principales:
Ef: agrupa los campos de negocio y marca sus metadatosEfGroup: define los grupos de campos
Las anotaciones se definen en src/Annotation/Ef.php y src/Annotation/EfGroup.php:
// src/Annotation/Ef.php
class Ef
{
public $value = [];
public function __construct(array $data)
{
$this->value['group'] = $data['group'] ?? null;
$this->value['bf'] = $data['isBF'] ?? false;
}
}Definir un modelo
namespace App\Entity\Organization;
use App\Annotation\Ef;
use App\Entity\Traits\CommonTrait;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Table(name: 'org_department')]
class Department
{
use CommonTrait;
#[ORM\Id]
#[ORM\Column(type: 'uuid', unique: true)]
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
#[ORM\CustomIdGenerator(class: 'doctrine.uuid_generator')]
private $id;
#[Ef(displayName: 'Nombre del departamento', required: true)]
#[ORM\Column(length: 100)]
private string $name;
#[Ef(displayName: 'Código del departamento', searchable: true)]
#[ORM\Column(length: 50, nullable: true)]
private ?string $code = null;
}Gestión de entidades
Las entidades pueden verse y gestionarse en el panel de administración en Plataforma low-code → Gestión de entidades (App\Controller\Admin\Platform\EntityController):
Directorios principales de entidades
| Directorio | Entidades | Descripción |
|---|---|---|
Entity/Organization/ | Department, Company, Corporation, Employee, Position, PositionLevel | Estructura organizativa y empleados |
Entity/Platform/ | Entity, EntityProperty, View, ViewField, DataGrid, Menu, DataSource | Motor low-code |
Entity/Security/ | PasswordPolicy, PasswordStrengthRule, PasswordResetMethod, WebauthnCredential | Sistema de seguridad |
Entity/Storage/ | File, StorageConfig, UploadSession | Almacenamiento de archivos |
Entity/System/ | AuditLog, Task, TaskLog, EmailConfig, EmailTemplate, EmailLog, SystemCalendarEvent | Infraestructura |
CommonTrait
Todas las entidades combinan las siguientes capacidades mediante CommonTrait (src/Entity/CommonTrait.php):
trait CommonTrait
{
use SoftDeleteableEntity; // Borrado suave (campo deletedAt)
use TimestampableEntity; // Marcas de tiempo (createdAt, updatedAt)
use BlameableEntity; // Autor de la operación (createdBy, updatedBy)
#[ORM\ManyToOne(targetEntity: Corporation::class)]
private $corporation;
#[ORM\ManyToOne(targetEntity: Company::class)]
private $company;
}Generación automática
Después de definir el modelo, comandos como EfInitEntityCommand procesan automáticamente:
- Generación de archivos de migración de base de datos
- Renderizado de la interfaz CRUD
- Reglas de validación de datos
- Comprobaciones de permisos
Panel de administración
En Plataforma low-code → Gestión de entidades (/admin/platform/entity) se pueden realizar operaciones visuales:
- Edición de propiedades de entidad (EntityProperty)
- Gestión de grupos de propiedades (EntityPropertyGroup)
- Generación de migraciones con un clic
- Configuración de relaciones