Pular para conteúdo

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.