DelphiMVCFramework 3.5 RC7 entra no Project Manager do Delphi e conversa com os agentes de IA
🇬🇧 English • 🇮🇹 Italiano • 🇪🇸 Español • 🇩🇪 Deutsch • 🇫🇷 Français

O que mudou no DelphiMVCFramework depois da RC6? O trabalho na 3.5 se concentrou em como você cria e faz crescer um projeto, dentro da IDE do Delphi e junto com os agentes de IA. Desta vez eu mostro com screenshots.
DelphiMVCFramework 3.5.0-silicon RC7 é uma release candidate, não a 3.5.0 final: as funcionalidades são as que você vê aqui, e a tag estável chega depois que a RC tiver rodado em máquinas que não são a minha.
A RC6 é de 23 de agosto, e o post que a anunciava falava de hosts, Minimal API e serializador em streaming. A RC7 saiu em 22 de setembro. Depois, no master, chegaram duas novidades para o trabalho do dia a dia em um projeto. Um menu DMVCFramework no Project Manager do Delphi cria controllers, grupos de rotas e views e os registra no projeto. Os arquivos para agentes de IA dão ao seu assistente as regras e os fontes do framework, assim ele não escreve a API de memória. Depois vem o resto: Swagger UI com OpenAPI 3, as páginas web geradas, QUERY, ProblemDetails.
Abaixo você encontra um passeio rápido, quase todo em imagens. Cada assunto tem seu capítulo no guia oficial, segunda edição, com o código completo e as explicações que neste post eu pulo.
O que está onde
Tudo o que você vê aqui pertence à RC7: é a versão que o wizard escreve nos projetos gerados (3.5.0-silicon-rc7, você encontra também nos screenshots). Mas uma parte ainda não está no zip da tag:
- Na RC7 (tag v3.5.0-silicon-rc7): o método HTTP
QUERY, a revisão de segurança com seus novos padrões, os limites do servidor WebSocket, as correções para HTTP.sys, SQL Server e Delphi 13.2. - No master, depois da RC7: todo o resto. O menu no Project Manager, os arquivos para agentes de IA, o wizard com OpenAPI 3, as páginas web geradas, o sample com os formulários, ProblemDetails. Para ter tudo isso, clone o master.
Os screenshots abaixo vêm do master.
Um menu DMVCFramework no Project Manager
No Delphi 12 e 13, clique com o botão direito em um projeto DelphiMVCFramework no Project Manager, e aparece um submenu DMVCFramework:

Escolha New REST Controller…, digite o nome, e o resto se preenche sozinho: o segmento de URL e a classe do modelo à qual o body das requisições é ligado.

Clique em OK e o menu cria Controllers.OrdersU.pas, adiciona ao projeto e registra em EngineConfigU.pas: a unit na uses e AEngine.AddController(TOrdersController) ao lado dos outros controllers. As alterações passam pelo buffer do editor, então um Ctrl+Z desfaz tudo.

Este é o controller gerado, do jeito que sai do menu em um projeto com a documentação OpenAPI ativa:
type
TOrder = class
private
fID: Integer;
fName: string;
public
property ID: Integer read fID write fID;
[MVCRequired]
property Name: string read fName write fName;
end;
[MVCPath('/api/orders')]
[MVCSWAGDefaultModel(TOrder, 'Order', 'Orders')]
[MVCSWAGDefaultSummaryTags('Orders')]
TOrdersController = class(TMVCController)
public
[MVCPath]
[MVCHTTPMethod([httpGET])]
[MVCSwagSummary(TSwaggerConst.USE_DEFAULT_SUMMARY_TAGS, 'List orders', 'getOrders')]
// last argument: OkResponse renders the body as {"data": ...}
[MVCSwagResponses(200, 'Success', SWAGUseDefaultControllerModel, True, True)]
function GetAll: IMVCResponse;
[MVCPath('/($ID:int)')]
[MVCHTTPMethod([httpGET])]
[MVCSwagSummary(TSwaggerConst.USE_DEFAULT_SUMMARY_TAGS, 'Get one', 'getOrder')]
[MVCSwagResponses(200, 'Success', SWAGUseDefaultControllerModel, False, True)]
[MVCSwagResponses(404, 'Not found')]
function GetByID(ID: Integer): IMVCResponse;
// the body is bound to Item and validated (422 on failure); the framework frees it
[MVCPath]
[MVCHTTPMethod([httpPOST])]
[MVCSwagSummary(TSwaggerConst.USE_DEFAULT_SUMMARY_TAGS, 'Create', 'createOrder')]
[MVCSwagParam(plBody, 'Item', 'The item to create', SWAGUseDefaultControllerModel)]
[MVCSwagResponses(201, 'Created')]
[MVCSwagResponses(422, 'Validation failed')]
function CreateItem([MVCFromBody] Item: TOrder): IMVCResponse;
...
O body chega já desserializado em Item e já validado: sem name a requisição nem entra na action e o cliente recebe um 422. O schema das respostas vem da classe do modelo: com o último argumento de MVCSwagResponses o documento descreve também o envelope {"data": ...} que o OkResponse acrescenta. Os atributos MVCSwag* só existem se o projeto publicar um documento OpenAPI, e é por isso que Orders e o seu modelo aparecem no Swagger UI sem que eu tenha escrito uma linha: você vê isso mais abaixo.
O menu mostra só o que o projeto pode receber. Em um projeto Minimal API um controller não faria sentido, e de fato o item é outro:

New Minimal API Route Group… cria OrdersRoutesU.pas com uma procedure MapOrdersRoutes (bodies ligados por tipo com MapPost<TOrder> e MapPut<Integer, TOrder>) e acrescenta a chamada no final de ConfigureRoutes. Os outros dois itens são New Web Controller and View… e New TemplatePro View…, e só aparecem se o projeto tem uma pasta de views. Nas versões do Delphi anteriores à 12 o menu não existe.
Um projeto que nasce com as skills certas
Se você escreve código com Claude Code, Codex, Cursor ou Gemini, um agente que não conhece o DelphiMVCFramework inventa nomes de métodos plausíveis, ou usa os de uma versão antiga, e o compilador só avisa depois.
Com a RC7 todo projeto DelphiMVCFramework novo já nasce pronto para o agente: o wizard coloca nele as skills adequadas àquele tipo de projeto, tiradas da mesma linha do framework que você está usando. São as boas práticas escritas para quem desenvolve com DelphiMVCFramework, divididas por assunto:
- Delphi: a linguagem e a RTL, as diferenças entre versões, gerenciamento de memória, strings, generics, threads; mais uma skill de code review sobre warnings, análise estática e memory leaks.
- DelphiMVCFramework: controllers, ActiveRecord, validação, injeção de dependência, middleware, os três hosts,
.env. - Segurança: as regras para todo endpoint que recebe input do cliente.
- Testes: testes de integração com DUnitX.
- Minimal API, web application, interface, JSON-RPC: quando o projeto usa essas coisas.
- HTMX: a documentação oficial, organizada para o agente.
A vantagem você vê desde o primeiro pedido. Sem skills e sem AGENTS.md, toda sessão com o agente começa com você explicando o projeto e o framework, e continua com você corrigindo o código que ele escreveu de memória: um método que não existe, um pattern de uma versão antiga, um objeto liberado duas vezes. Com o projeto gerado pelo wizard, o agente já sabe como o projeto é organizado, onde ficam os fontes do framework e como se escreve um controller, uma entidade ActiveRecord ou uma página HTMX no DelphiMVCFramework 3.5. Esse tempo você economiza em toda sessão.
Tem também a segurança. Entre as skills instaladas em todo projeto está a dmvcframework-security, com as regras para qualquer endpoint que recebe input do cliente: controle de acesso, mass assignment, SQL injection, XSS, CSRF, path traversal e uploads, JWT, segredos e mensagens de erro, mais um checklist para passar antes que um endpoint vá para produção. O agente lê essa skill antes de escrever um endpoint, então o código que você recebe tende a ser mais seguro do que o que ele escreveria partindo do zero.
As skills ficam em um repositório à parte, com um branch para cada linha do framework, e são atualizadas independentemente das releases: quando sai uma versão nova de uma skill, o update_ai_skills.bat na pasta do projeto a traz para dentro.
A opção fica na página Project Options, AI coding agent files and skills, e vem ativa por padrão em todos os presets. As skills são baixadas enquanto o wizard cria o projeto, com uma barra de progresso que você pode cancelar; se você não precisa delas, desmarque a opção.

Com a opção ligada o wizard escreve na pasta do projeto um AGENTS.md com os fatos do projeto, mais CLAUDE.md e GEMINI.md, que o importam. Depois baixa em .claude\skills as delphi-ai-skills adequadas àquele tipo de projeto, do branch que corresponde à versão do framework (dmvc-3.5 para esta). Este é o AGENTS.md de um projeto RESTful API gerado pela suíte de testes do wizard, que o chama de TestProject:
# TestProject
DelphiMVCFramework 3.5.0-silicon-rc7 project, generated by the DMVCFramework IDE wizard.
- `TestProject.dproj` builds the executable into `bin\`, next to `bin\.env` (configuration and secrets: never commit real values).
- Build from the command line: `rsvars.bat`, then `msbuild TestProject.dproj /p:Config=Debug /p:Platform=Win32`.
## Skills
Before writing Delphi or DelphiMVCFramework code, read the skill for the task. They target DelphiMVCFramework 3.5.x; `update_ai_skills.bat` downloads or refreshes them.
- `.claude/skills/delphi/SKILL.md` - the language and the RTL: version gating, lifetime, strings, generics, threading
- `.claude/skills/delphi-code-smells/SKILL.md` - code review: compiler warnings, static analysis, memory leaks
- `.claude/skills/dmvcframework/SKILL.md` - controllers, ActiveRecord, validation, DI, middleware, servers, dotEnv
- `.claude/skills/dmvcframework-security/SKILL.md` - REQUIRED for any endpoint taking client input
- `.claude/skills/dmvcframework-testing/SKILL.md` - DUnitX integration tests
Do not write Delphi or DelphiMVCFramework code from memory: the API names in these files are authoritative.
<!-- delphi-local-sources -->
DelphiMVCFramework checkout: C:\DEV\dmvcframework (sources/ + samples/)
Delphi RTL/VCL source: C:\Program Files (x86)\Embarcadero\Studio\37.0\source (CompilerVersion 37.0)
<!-- /delphi-local-sources -->
O último bloco diz ao agente onde ficam, no seu disco, os fontes do framework e da RTL: quando ele tem uma dúvida sobre um nome, vai ler o código de verdade.
Quais skills são instaladas depende do projeto. delphi, delphi-code-smells, dmvcframework, dmvcframework-security e dmvcframework-testing estão sempre lá; um projeto Minimal API acrescenta dmvcframework-minimal-api, uma web application dmvcframework-webapp e dmvcframework-ui, com HTMX também htmx-skill, um serviço JSON-RPC dmvcframework-jsonrpc. Se durante a criação o download falhar, o projeto é criado do mesmo jeito, com um warning, e o update_ai_skills.bat completa a instalação assim que você tiver conexão.
O wizard: documentação da API e chave JWT
Na página Features do preset Custom há uma opção nova, API documentation (OpenAPI 3). Nos outros presets você não a vê porque ela já está decidida: vem ativa em RESTful API, Minimal API RESTful e Full-Stack.

Com a opção ativa o wizard baixa a release oficial do Swagger UI (5.33.0, verificada com SHA-256) em bin\www\swagger enquanto cria o projeto. Se você estiver offline o projeto é criado do mesmo jeito e naquela pasta você encontra um README com os passos para baixá-la manualmente. O documento só é publicado se o .env contiver dmvc.openapi.enabled=true: o .env gerado contém, o de produção não, e em produção a documentação não é publicada.
Os projetos com JWT agora têm no .env uma JWT_SECRET só deles, 384 bits vindos do gerador criptográfico do sistema, diferente a cada geração. O .gitignore gerado já exclui o .env.
Swagger UI com OpenAPI 3
Este é o projeto gerado com o preset RESTful API, ao qual eu acrescentei o controller Orders com o menu que acabamos de ver. Você roda o projeto, abre http://localhost:8080/swagger e encontra isto:

O middleware Swagger, aquele que você usa há anos, agora produz também OpenAPI 3. Quem monta o documento é o SwagDoc, a biblioteca incluída no framework, e o suporte a OpenAPI 3 no SwagDoc foi escrito por Marcelo Jaloto (PR #916): obrigado, Marcelo! O formato é escolhido com um novo último parâmetro, ASpecVersion, que por padrão continua Swagger 2.0, então quem atualiza não vê nada mudar. O projeto gerado o registra assim:
AEngine.AddMiddleware(TMVCSwaggerMiddleware.Create(AEngine, LSwaggerInfo, '/openapi.json',
JWT_DEFAULT_DESCRIPTION, False, '', '', '', [psHTTP], False, ssvOpenAPI3));
AEngine.AddMiddleware(TMVCStaticFilesMiddleware.Create('/swagger',
TPath.Combine(TPath.Combine(AppPath, 'www'), 'swagger')));
Funciona tudo o que funcionava com Swagger 2.0: segurança JWT e basic, MVCSwagAuthentication, MVCSWAGDefaultModel, os caminhos CRUD do TMVCActiveRecordController. O esquema JWT é http/bearer, então na janela Authorize você cola o token do jeito que está. O servidor no documento é relativo, e o “Try it out” chama a origem que serviu o documento, inclusive atrás de um proxy.

Nos projetos Minimal API o wizard registra em vez disso o filtro OpenAPI(...) de MVCFramework.OpenAPI3, que gera um documento OpenAPI 3.1 a partir das rotas lambda e o publica na mesma URL, com o mesmo Swagger UI.
Os campos TDate, TDateTime e TTime agora são descritos com os formatos padrão date, date-time e time, então um cliente regenerado a partir do documento recebe tipos de data em vez de strings (isso também chega com a PR do Marcelo). Os atributos de documentação dos campos agora se chamam todos MVCSwag*: MVCFormat, MVCMinimum e MVCMaximum ainda compilam, com um warning, até a 4.0.
As web applications geradas
O preset Web Application agora parte de uma interface mais completa: cabeçalho de página, um painel com o estado do servidor atualizado via HTMX, uma lista “Start here” com os primeiros passos, tema claro e escuro. Mas o código gerado continua sendo o mínimo: o exemplo com tabela e formulários foi para um sample à parte, do qual falo mais abaixo.


O preset Minimal API WebApp gera as mesmas páginas, com as rotas lambda no lugar dos controllers. Abaixo está a página de login depois de uma tentativa errada: o username fica no campo, a senha não. O formulário é ligado a uma classe, e a página o mostra de novo a partir dela.

Tabelas e formulários com HTMX: webapp_htmx_forms
O exemplo da tabela People, que antes ficava no projeto gerado, virou um sample próprio: samples/webapp_htmx_forms. Lá estão busca, filtros, ordenação e os formulários completos, sem pesar em todo projeto novo.
A tabela pode ser filtrada, pesquisada e ordenada por coluna. Com HTMX o servidor devolve só o fragmento da tabela e a página não recarrega; a action decide se manda a página inteira ou o fragmento, e define Vary: HX-Request porque a mesma URL tem dois bodies diferentes.

Os formulários de inclusão e edição usam todas as macros da biblioteca de formulários do TemplatePro (bin/templates/lib/forms_bootstrap5.tpro, que o wizard copia em todo projeto TemplatePro) e são validados no servidor com os atributos do DelphiMVCFramework e o TMVCValidationEngine. Se algo der errado, o formulário volta com status 422, os valores que você digitou e a mensagem ao lado do campo. Se der tudo certo, redirect para a tabela (Post/Redirect/Get), assim um F5 não reenvia o formulário.

Do lado do TemplatePro, o cache das views compiladas agora fica em memória: com view_cache=true, depois da primeira requisição uma view não toca mais o disco. Se você as altera com o servidor rodando, dmvc.view_cache_check_changes=true volta a fazer a verificação a cada requisição, layouts e partials incluídos.
Formulários gerados com TemplatePro
O formulário do screenshot acima vem da biblioteca de formulários do TemplatePro, forms_bootstrap5.tpro, que o wizard copia em bin/templates/lib em todo projeto com views TemplatePro. Você a importa uma vez no topo da página e tem oito macros: form, input, textarea, select, checkbox, submit, actions e auto.
{{import "../lib/forms_bootstrap5.tpro" as f}}
{{call f.form(form_action)}}
{{>f.input("id", label="ID", readonly=true)}}
{{>f.input("name", label="Name", required=true)}}
{{>f.select("role", roles, label="Role", empty="Choose a role")}}
{{>f.input("projects", type="number", append="active")}}
{{>f.textarea("notes", label="Notes", rows=3)}}
{{>f.checkbox("remote", label="Works remotely")}}
{{>f.submit("Save")}}
{{endcall}}
Cada macro lê o valor do campo de formModel e a mensagem de erro de formErrors, duas variáveis que você define na action. O modelo pode ser um objeto, o registro corrente de um dataset, um objeto JSON ou um dicionário. Se há um erro para aquele campo, o controle recebe a classe is-invalid e a mensagem aparece embaixo: é o que você vê no formulário exibido de novo com o 422. Valores e mensagens são sempre HTML-escaped, as datas são formatadas para os controles date, time e datetime-local, e com attrs você passa um mapa de atributos extras, por exemplo os do HTMX. A mesma página serve para criar e para editar: só mudam o modelo e a action.
E tem o auto, que gera o formulário inteiro sozinho:
{{call f.form("/forms", attrs=formattrs)}}
{{>f.auto(demo)}}
{{>f.submit("Save")}}
{{endcall}}

O auto percorre os campos do modelo (model.@@fields: as propriedades de um objeto ou os campos de um dataset) e escolhe o controle pelo tipo. Uma string vira um campo de texto com maxlength tirado do tamanho, um inteiro um campo numérico, um TDate um date picker, um TDateTime um datetime-local, um TTime um campo de hora, um Boolean uma checkbox, um memo uma textarea. Uma propriedade sem setter vira readonly. O rótulo vem do nome: FullName vira “Full name”. Com exclude você tira os campos que não quer mostrar.
Se o modelo é uma entidade TMVCActiveRecord, adicione à uses a unit MVCFramework.View.Renderers.TemplatePro.ActiveRecord (o wizard faz isso sozinho nos projetos com ActiveRecord e TemplatePro). A partir daí os campos seguem o mapeamento do ActiveRecord e os validadores: [MVCRequired] vira o atributo required, [MVCMaxLength(n)] vira maxlength. Para todo o resto existe TTProConfiguration.OnGetFieldMetadata, que permite mudar rótulo, tipo, visibilidade e obrigatoriedade de cada campo. O formulário completo com todas as macros está na página /forms do sample samples/wizard_showcase/web.
ProblemDetails mais aderente à RFC 7807
As respostas de ProblemDetails(...) agora seguem a RFC 7807 mais de perto: o problem object é o body inteiro e o Content-Type é application/problem+json. O 422 da Minimal API tem a mais um membro errors, com a mensagem de cada campo.
Este é o grupo de rotas Orders gerado pelo menu, em um projeto Minimal API: um POST sem name, depois um POST com um array no lugar do objeto.
$ curl -s -i -X POST http://localhost:8080/api/orders -H "Content-Type: application/json" -d "{\"id\":7}"
HTTP/1.1 422 Unprocessable Entity
Connection: keep-alive
Content-Type: application/problem+json; charset=UTF-8
Content-Length: 176
Date: Mon, 05 Oct 2026 15:22:03 GMT
{"type":"about:blank","title":"Unprocessable Content","status":422,"detail":"Validation failed for fields: Name","instance":"/api/orders","errors":{"Name":"Field is required"}}
$ curl -s -i -X POST http://localhost:8080/api/orders -H "Content-Type: application/json" -d "[1,2]"
HTTP/1.1 400 Bad Request
Connection: keep-alive
Content-Type: application/problem+json; charset=UTF-8
Content-Length: 163
Date: Mon, 05 Oct 2026 15:22:03 GMT
{"type":"about:blank","title":"Bad Request","status":400,"detail":"Body is not a valid JSON Object - Expected TJsonObject got TJsonArray","instance":"/api/orders"}
Um array onde é esperado um objeto é um erro do cliente, então a resposta é um 400, tanto nos controllers com [MVCFromBody] quanto na Minimal API.
O método HTTP QUERY
QUERY (RFC 10008) é seguro e idempotente como GET, mas tem um body: a busca viaja no payload, não na URL, então não tem limite de tamanho e não vai parar nos logs de acesso, nos caches dos proxies ou no histórico do navegador. Falei disso em detalhe em um post dedicado. Na RC7 você o encontra nos controllers, na Minimal API (MapQuery) e no IMVCRESTClient (Query).
O sample samples/routing faz a mesma busca duas vezes, com GET e com QUERY:
[MVCHTTPMethod([httpQUERY])]
[MVCPath('/customers/searches')]
[MVCConsumes(TMVCMediaType.APPLICATION_JSON)]
[MVCProduces(TMVCMediaType.APPLICATION_JSON)]
function SearchCustomersUsingQuery(
const [MVCFromBody] Criteria: TCustomerSearch): TObjectList<TPerson>;
$ curl -s -i -X QUERY http://localhost:8080/api/customers/searches -H "Content-Type: application/json" -d "{\"searchtext\":\"rossi\",\"cities\":[\"rome\",\"milan\"],\"pricerange\":{\"min\":10,\"max\":90},\"orderby\":\"lastname\",\"page\":2}"
HTTP/1.1 200 OK
Connection: close
Content-Type: application/json; charset=utf-8
Content-Length: 226
Date: Mon, 05 Oct 2026 17:22:01 GMT
Server: DMVCFramework
X-Powered-By: DMVCFramework 3.5.0-silicon-rc7
[{"firstname":"Daniele","lastname":"Teti","dob":"1975-05-02","married":false},{"firstname":"John","lastname":"Doe","dob":"1975-05-02","married":false},{"firstname":"Mark","lastname":"Rossi","dob":"1975-05-02","married":false}]
Antes de colocar em produção: para o CSRF trate-o como POST, não como GET. O padrão de Access-Control-Allow-Methods do filtro CORS não o inclui, e se um navegador de outra origem precisa chamá-lo você tem que passar a lista completa. E no documento Swagger/OpenAPI ele não aparece: o slot query só existe no OpenAPI 3.2, e o framework pula o verbo em vez de escrever um documento inválido.
Segurança: padrões mais seguros
A RC7 contém uma revisão de segurança do branch 3.5, e alguns padrões agora são mais seguros. Se você vai atualizar a partir de uma versão anterior, estes são os que você precisa conhecer:
X-HTTP-Method-Overridenão é mais suportado. Reescrever o verbo de uma requisição é trabalho do reverse proxy ou do servidor web que fica na frente da aplicação.IMVCRESTClienteTMVCSSEClientsó aceitam certificados válidos. Para um teste contra um host com certificado self-signed existeMVCRESTClientAcceptInvalidCertificates := True.- O cookie de sessão é
HttpOnlypor padrão, e a partir do Delphi 11 temSameSite=Lax.Secureé um parâmetro novo, desligado por padrão porque ligá-lo quebraria todo setup de desenvolvimento em HTTP; os projetos gerados o leem deSESSION_COOKIE_SECUREno.env. - Acima de
max_request_sizea resposta é 413 em todos os hosts, com o mesmo comportamento em Indy, HTTP.sys e WebBroker. - Mais proteção contra JSON malicioso: o parser recusa os documentos feitos para causar problemas no servidor.
[MVCMaxLength(n)]e[MVCPattern(...)]sempre validam, em qualquer ordem que as units apareçam nauses. Isto está no master: se você tem modelos com esses atributos, depois da atualização eles passam a ser validados.
A lista completa, com o motivo de cada mudança, está na seção Security do changelog.
O resto, em resumo
- Rotas verificadas no registro. Os tipos dos parâmetros (
int,int64,float,bool,guid,date,time,datetime,sqids) vêm de uma única função para os controllers e para a Minimal API;timeedatetimeaceitam só ISO 8601 e se ligam a parâmetrosTTimeeTDateTime. Um tipo desconhecido, um parâmetro sem nome ou um catch-all fora do lugar fazem o registro falhar: o servidor não sobe, em vez de responder 404 para sempre a uma rota escrita errada. - O body pode ser devolvido na resposta.
Result := OkResponse(Person)com[MVCFromBody] Person, ouOk(Item)na Minimal API: a resposta assume a posse do objeto e o libera depois do render. - HTTP.sys responde a
PATCH,SEARCHe aos outros verbos que o kernel não interpreta sozinho. - Servidor WebSocket: quatro limites configuráveis sobre handshake e tamanho dos frames, ativos por padrão (PR #915).
- SQL Server:
foRefreshdevolve a linha depois dos triggers, Insert e Update funcionam em tabelas com triggers, o locking otimista é detectado inclusive atrás de um trigger semSET NOCOUNT ON(diagnóstico de Flavio Basile). - Delphi 13.2: o framework compila também na última atualização do Delphi 13 (#917).
- TemplatePro aceita mais tipos de campo dos datasets e não mostra mais como negativos os valores unsigned grandes (contribuição de Patrick Premartin).
No Patreon: artigos e vídeos sobre estas funcionalidades
Para os apoiadores no Patreon vão chegar artigos e vídeos dedicados justamente a estas novidades: o menu do Project Manager, as skills para os agentes de IA, a documentação OpenAPI gerada. Como usá-las no trabalho do dia a dia, passo a passo.
Se você usa o DelphiMVCFramework profissionalmente, peço que apoie o projeto. É um investimento no seu negócio: o framework em que você trabalha continua crescendo, e como apoiador você pode orientar os próximos desenvolvimentos. Além disso, você tem acesso aos conteúdos de treinamento dedicados, aos grupos exclusivos no Discord com suporte privilegiado e ao suporte prioritário por e-mail.
Experimentar
Para a RC7, baixe o zip da página de release e adicione sources ao library path. Para todo o resto, clone o master e instale o package dmvcframeworkDT da sua versão do Delphi: os presets aparecem em File > New > Other, em Delphi > DelphiMVCFramework, e o menu no Project Manager vem com o mesmo package.
Se algo não bater, abra uma issue no GitHub. Ainda estamos na fase de release candidate, e é agora que um relato vira uma correção na 3.5.0.
Recursos
- Página de release da RC7 - download e changelog
- Repositório GitHub - código-fonte, master e mais de 40 samples
- O guia oficial, segunda edição - cada assunto deste post, tratado em detalhe, no Leanpub
- DelphiMVCFramework 3.5.0-silicon RC6 - hosts, Minimal API, serializador em streaming e breaking changes
- Delphi AI Skills - as skills para agentes de IA que o wizard instala nos projetos
- Delphi Minimal API - rotas lambda, sem classes controller
- Comunidade PATREON - artigos e vídeos sobre as novas funcionalidades, grupos exclusivos no Discord, suporte prioritário por e-mail
Enjoy!
– Daniele Teti
Fatos principais
- Tema: as novidades do DelphiMVCFramework 3.5.0-silicon depois da RC6 (23 de agosto de 2026): a RC7 (tag v3.5.0-silicon-rc7, 22 de setembro de 2026) e o que está no master em 5 de outubro de 2026 (mesma versão, 3.5.0-silicon-rc7). É uma release candidate, não a 3.5.0 final.
- Na RC7: método HTTP QUERY (RFC 10008) com [MVCHTTPMethod([httpQUERY])], MapQuery na Minimal API e Query em IMVCRESTClient; o HTTP.sys deixa de tratar SEARCH e outros verbos como GET; uma revisão de segurança com novos padrões (sessão HttpOnly, 413 em todo host acima de max_request_size, proteção contra JSON malicioso, X-HTTP-Method-Override ignorado, certificados inválidos recusados pelo IMVCRESTClient); limites no servidor WebSocket; correções para SQL Server e para Delphi 13.2.
- No master depois da RC7: OpenAPI 3 pelo middleware Swagger (ssvOpenAPI3), opção "API documentation (OpenAPI 3)" no wizard com Swagger UI 5.33.0 baixada na criação do projeto e publicada em /swagger quando o .env define dmvc.openapi.enabled=true; chave JWT gerada no .env; arquivos para agentes de IA (AGENTS.md, CLAUDE.md, GEMINI.md e as delphi-ai-skills) como opção do wizard, ativa por padrão em todos os presets.
- Menu "DMVCFramework" no Project Manager do Delphi 12 e 13: novo controller REST, controller web com view, grupo de rotas Minimal API, view TemplatePro; a unit é registrada sozinha (AddController ou Map<Name>Routes) e os bodies são ligados a uma classe modelo com [MVCFromBody] ou MapPost<TModel>; com OpenAPI ativo o modelo aparece no Swagger UI.
- Web application: interface gerada mais completa (Bootstrap 5.3, tema claro e escuro), Minimal API WebApp com as mesmas páginas, novo sample samples/webapp_htmx_forms com tabela filtrável via HTMX e formulários validados no servidor com resposta 422.
- ProblemDetails é um body RFC 7807 de verdade (application/problem+json); o 422 da Minimal API tem um membro errors campo a campo; um body JSON do tipo errado responde 400 em vez de 500.
- As novidades são aprofundadas no guia oficial do DelphiMVCFramework, segunda edição, no Leanpub.
- Autor: Daniele Teti, criador do DelphiMVCFramework.

Comments