Arquitetura¶
O MIDDAG é um framework-base para Moodle LMS. Extensões consomem a API pública via 3 camadas.
Requisitos: PHP 8.2+, Moodle 4.5+.
O que você consome¶
┌──────────────────────────────────────────┐
│ classes/facade/ │ Facades — acesso estático às funcionalidades
├──────────────────────────────────────────┤
│ classes/base/ │ Classes-base — herança para sua extensão
├──────────────────────────────────────────┤
│ sua extension │ classes/extensions/{slug}/
├──────────────────────────────────────────┤
│ framework interno │ Você não acessa diretamente
│ (kernel, domain, infra, moodle) │ Tudo via facade/ e base/
└──────────────────────────────────────────┘
| Camada | O que é | Seu uso |
|---|---|---|
facade/ |
Proxies estáticos gerados via CLI | search::query(), config::get(), hook_manager::do_action() |
base/ |
Abstrações para herança | extends base\extension, extends base\controller, extends base\entity |
contract/ (@api) |
Interfaces para DI | Type-hint no construtor: item_service_interface, dispatcher_interface |
moodle/entity/ |
Objetos do Moodle tipados | user, course, context — todos @api |
moodle/dto/ |
DTOs do Moodle | plugin_dto, scheduled_task_dto — todos @api |
Tudo fora do Grupo A e da camada base/ é interno e pode mudar sem aviso.
Como no Moodle tradicional vs MIDDAG¶
| Aspecto | Moodle tradicional | MIDDAG |
|---|---|---|
| Acesso ao DB | $DB->get_record() direto |
repository + query_builder via facade |
| Settings | admin_setting_configtext(...) manual |
DSL typed: new text('key', default: '...') |
| Rotas | Arquivo PHP solto em raiz do plugin | #[Route('/path')] no controller |
| Validação | required_param() / optional_param() |
form_request com regras declarativas |
| Eventos | \core\event\* classes manuais |
Typed definitions + build_statics gera automaticamente |
| Hooks | lib.php com funções callback |
hook_manager::add_action() + #[on] attribute |
Persistência¶
Dados são armazenados em EAV (Entity-Attribute-Value). Sua extension declara um #[item_type] e o framework gerencia o schema.
| Família | O que armazena |
|---|---|
| Current state | Dados atuais dos items (EAV) |
| Revision | Histórico de versões (EAV) |
| Audit | Logs de alterações (relacional) |
| Job | Governança de execução assíncrona (relacional) |
| Activity feed | Timeline operacional (relacional) |
Fluxo de requisição¶
graph TD
User((Usuário)) -->|HTTP| Entry[index.php / webhook.php / ajax.php]
Entry --> Kernel[Kernel]
Kernel -->|route| Controller[Seu Controller]
Controller -->|validate| FormRequest[form_request]
Controller -->|delegate| Service[Seu Service]
Service -->|query| Facade[Facades do framework]
Controller -->|render| Response[Moodle Page / Inertia / JSON]
O parceiro interage com Controller → Service → Facade. O kernel, routing e DI são transparentes.