Modelo dinâmico
O motor de modelo dinâmico é o núcleo da plataforma low-code do Doggy. Através da anotação @Ef combinada com os Attributes do PHP 8, marca os campos de negócio e gera automaticamente migrações de base de dados, APIs e interface de administração.
Visão geral
O sistema de modelo dinâmico é construído sobre duas anotações centrais:
Ef: marca os atributos de metadados e agrupamento dos campos de negócioEfGroup: define agrupamentos de campos
As anotações estão definidas em src/Annotation/Ef.php e 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 um 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: '部门名称', required: true)]
#[ORM\Column(length: 100)]
private string $name;
#[Ef(displayName: '部门编码', searchable: true)]
#[ORM\Column(length: 50, nullable: true)]
private ?string $code = null;
}Gestão de entidades
As entidades podem ser consultadas e geridas no backoffice, em Plataforma low-code → Gestão de entidades (App\Controller\Admin\Platform\EntityController):
Principais diretórios de entidades
| Diretório | Entidades | Descrição |
|---|---|---|
Entity/Organization/ | Department, Company, Corporation, Employee, Position, PositionLevel | Estrutura organizacional e empregados |
Entity/Platform/ | Entity, EntityProperty, View, ViewField, DataGrid, Menu, DataSource | Motor low-code |
Entity/Security/ | PasswordPolicy, PasswordStrengthRule, PasswordResetMethod, WebauthnCredential | Sistema de segurança |
Entity/Storage/ | File, StorageConfig, UploadSession | Armazenamento de ficheiros |
Entity/System/ | AuditLog, Task, TaskLog, EmailConfig, EmailTemplate, EmailLog, SystemCalendarEvent | Infraestrutura |
CommonTrait
Todas as entidades combinam as seguintes capacidades através do CommonTrait (src/Entity/CommonTrait.php):
trait CommonTrait
{
use SoftDeleteableEntity; // eliminação suave (campo deletedAt)
use TimestampableEntity; // timestamps (createdAt, updatedAt)
use BlameableEntity; // autor da operação (createdBy, updatedBy)
#[ORM\ManyToOne(targetEntity: Corporation::class)]
private $corporation;
#[ORM\ManyToOne(targetEntity: Company::class)]
private $company;
}Geração automática
Após definir o modelo, comandos como EfInitEntityCommand tratam automaticamente de:
- Geração de ficheiros de migração de base de dados
- Renderização de interfaces CRUD
- Regras de validação de dados
- Verificações de permissões
Backoffice
Em Plataforma low-code → Gestão de entidades (/admin/platform/entity) pode realizar operações visuais:
- Edição de propriedades de entidade (EntityProperty)
- Gestão de agrupamentos de propriedades (EntityPropertyGroup)
- Geração de migrações com um clique
- Configuração de relações