Laravel 13: APIs nativas de IA, recursos JSON:API e um caminho de upgrade mais limpo cover image

Laravel 13: APIs nativas de IA, recursos JSON:API e um caminho de upgrade mais limpo

O Laravel 13 foi lançado em 17 de março de 2026, e a sensação é menos de reescrita radical e mais de major bem focada: PHP 8.3 vira requisito mínimo, primitivas de IA entram no ecossistema oficial, respostas de API ganham um caminho compatível com especificação, e uma série de melhorias no dia a dia deixam o framework mais preciso. Se você mantém apps em produção no Laravel 11 ou 12, vale planejar o upgrade — não porque exige reescrita, mas porque vários recursos eliminam código cola que provavelmente você mesmo escreveu.

PHP 8.3 Agora É Obrigatório

O primeiro passo de qualquer upgrade é compatibilidade de runtime. O Laravel 13 abandona o PHP 8.2 e exige PHP 8.3 até 8.5. Isso alinha o framework a constantes tipadas em classes, #[Override], json_validate() aprimorado e os ganhos gerais de performance que o PHP 8.3 trouxe para o ecossistema.

Na prática, a checklist de times costuma ser:

  • Confirmar que Docker local, runners de CI e servidores de produção rodam PHP 8.3+.
  • Rodar composer update laravel/framework em uma branch e observar warnings de depreciação.
  • Revisar pacotes customizados — especialmente os que mexem com HTTP, filas ou validação — quanto à compatibilidade com PHP 8.3.

O Laravel 13 segue o ciclo padrão de suporte: correções de bugs até o terceiro trimestre de 2027 e correções de segurança até março de 2028. Há margem confortável para migrar sem correria de deploy na sexta-feira.

Laravel AI SDK: IA Oficial Sem Camada de Adaptadores

O destaque do release é o Laravel AI SDK, pacote first-party que unifica geração de texto, embeddings, agentes com tool-calling, áudio, imagens e operações em vector stores. Em vez de integrar OpenAI num service, Anthropic em outro e montar um pipeline separado de embeddings para busca, você configura os providers uma vez e chama métodos consistentes a partir de controllers, jobs ou comandos Artisan.

Uma chamada típica de geração de texto pode ficar assim:

use Laravel\AI\Facades\AI;

$response = AI::prompt('Resuma esta fatura em duas frases.')
    ->with(['invoice' => $invoice])
    ->generate();

return $response->text();

O ganho real aparece em fluxos de agentes. O Laravel 13 permite definir ferramentas que o modelo pode invocar — consultar banco, checar estoque, disparar notificações — e o SDK cuida do ciclo request/response. Essa é a diferença entre demo de chatbot e funcionalidade que você coloca em produção com autenticação e auditoria.

O SDK suporta múltiplos providers nativamente, o que importa quando staging usa um modelo mais barato e produção um premium, ou quando compliance exige vendor específico em certas regiões. A configuração fica em config/ai.php, e trocar provider não exige reescrever regra de negócio.

Recursos JSON:API: APIs Compatíveis com a Spec Sem Pacote de Terceiros

Se você expõe APIs públicas ou para parceiros, provavelmente já debateu JSON:API. É verboso, mas previsível — clientes sabem onde encontrar relacionamentos, links de paginação e objetos de erro. O Laravel 13 adiciona recursos JSON:API first-party em Illuminate\Http\Resources\JsonApi, sem depender de pacote da comunidade ou montar compound documents na mão.

Uma resource class define tipo, atributos e relacionamentos num só lugar:

use Illuminate\Http\Resources\JsonApi\JsonApiResource;

class ArticleResource extends JsonApiResource
{
    public function type(): string
    {
        return 'articles';
    }

    public function attributes(): array
    {
        return [
            'title' => $this->title,
            'body' => $this->body,
            'published_at' => $this->published_at,
        ];
    }

    public function relationships(): array
    {
        return [
            'author' => $this->author(),
        ];
    }
}

Retornar uma collection inclui automaticamente links, recursos em included e metadados de paginação no formato que clientes JSON:API esperam. Para frontends Nuxt ou Vue consumindo sua API Laravel, essa consistência reduz parsing customizado — um ganho para times TypeScript que geram tipos a partir de respostas previsíveis.

Atributos PHP: Configuração Junto do Código

O Laravel vem migrando para configuração declarativa há anos, e a versão 13 amplia bastante a cobertura de attributes. Dá para anexar middleware, regras de autorização e comportamento de fila diretamente em classes e métodos, em vez de espalhar configuração entre arquivos de rotas e service providers.

Exemplos que substituem boilerplate:

  • #[Middleware('auth')] em métodos de controller, no lugar de arrays de middleware em route groups.
  • #[Authorize('update', 'post')] colocado junto da action que protege.
  • #[Tries(5)], #[FailOnTimeout], #[DeleteWhenMissingModels] em jobs, sem propriedades no construtor ou overrides em classe base.

Esse padrão vale ouro em bases grandes, onde antes era preciso grep em quatro diretórios para achar "onde este job está configurado?". Attributes deixam o comportamento visível no ponto de definição, o que melhora onboarding e code review.

Segurança: PreventRequestForgery e Defaults Mais Rígidos

O Laravel 13 formaliza a proteção CSRF no middleware PreventRequestForgery. A mudança de nome reflete comportamento ampliado: além da validação de token, o middleware faz verificação de requisição consciente de origem, rejeitando submissões cross-origin que antes podiam passar em setups de proxy mais exóticos.

Apps novos também retornam exceções em JSON para rotas api/* por padrão. Clientes não precisam mais enviar Accept: application/json para receber erros estruturados — um default pequeno que economiza horas de "por que minha API devolve HTML no 422?". Dá para customizar em bootstrap/app.php via shouldRenderJsonWhen().

Além disso, cache:clear agora suporta ClearCommand::prohibit(), no mesmo espírito da proteção já existente em comandos destrutivos de banco. É o tipo de trava que você quer antes de alguém rodar Artisan em produção com APP_ENV errado.

Filas e Cache: Menos Atrito de Infraestrutura

Três melhorias de fila se destacam para workloads de produção.

Roteamento de fila por classe. Use Queue::route() num service provider para mapear classes de job a connections e nomes de fila de forma centralizada:

Queue::route(GenerateReport::class, 'reports', 'redis-long');
Queue::route(SendNotification::class, 'notifications', 'sqs');

Chega de repetir onConnection() e onQueue() em todo construtor.

Payloads grandes no SQS. Quando os dados do job passam do limite de 1 MB do SQS, o Laravel 13 pode offload transparente para um disco configurado (geralmente S3) e enviar um ponteiro pela fila. Workers reidratam o payload automaticamente. Ative na config da connection SQS em extended_store_options.

Shutdown gracioso. Jobs que implementam Interruptible recebem callback quando o worker recebe SIGTERM durante deploy — útil para loops longos que precisam liberar locks ou salvar checkpoint.

No cache, Cache::touch($key, $ttl) estende o TTL de uma entrada existente sem ciclo read-modify-write. Ideal para dados tipo sessão, contadores de rate limit ou feature flags onde você só quer renovar expiração com atividade. O Laravel 13 também traz o driver storage, que usa um disco de filesystem existente — inclusive S3 — como key/value store, podendo eliminar Redis dedicado para cache de baixo tráfego.

Busca Semântica e Vetorial

Busca recebeu upgrade relevante. O Laravel 13 documenta suporte nativo a consultas vetoriais junto dos helpers de embedding do AI SDK, com integração first-party ao pgvector no PostgreSQL. Dá para armazenar embeddings em models Eloquent e rodar queries por similaridade sem cair em SQL cru em todo endpoint de busca.

O fluxo é direto: gerar embeddings na criação ou atualização do conteúdo (muitas vezes via job enfileirado com o AI SDK), persistir numa coluna vector e consultar por proxidade semântica na leitura. Para portais de documentação, catálogos de e-commerce ou busca de tickets de suporte, isso substitui LIKE '%palavra%' frágil por algo que usuários esperam em 2026.

Destaques de Developer Experience

Nem todo recurso do Laravel 13 exige guia de migração, mas vários economizam tempo imediatamente:

  • Diretiva Blade @fonts — integra com o plugin Vite de fontes para injetar preload, regras @font-face e push headers automaticamente.
  • Password::defaults()->toPasswordRulesString() — emite o atributo HTML passwordrules para gerenciadores de senha criarem senhas compatíveis com sua política.
  • foreignUuidFor() — helper de migration para chaves estrangeiras UUID, no mesmo espírito de foreignIdFor().
  • schedule:pause / schedule:resume — pausar tarefas agendadas durante manutenção sem redeploy.
  • --stop-when-empty-for no queue:work — workers ociosos encerram após N segundos, útil em ambientes com auto-scaling.
  • Str::studly('CBOR', normalize: true) — trata siglas em maiúsculas ao gerar nomes de classes.

Fazendo o Upgrade: Abordagem Prática

O Laravel 13 mantém o padrão recente de majors incrementais. A maior parte do código Laravel 12 sobe limpa. Concentre testes em áreas afetadas por novos defaults: validação CSRF/origem, renderização de exceções em API, configuração de filas e middleware customizado que assumia o nome antigo da classe CSRF.

Um caminho sensato de upgrade:

  • Atualizar PHP para 8.3+ em todos os ambientes primeiro.
  • Subir laravel/framework para ^13.0 e rodar a suíte de testes.
  • Revisar o diff das release notes quanto a middleware renomeado e novo comportamento padrão de exceções.
  • Adotar recursos aos poucos — JSON:API na próxima versão da API, AI SDK numa feature antes de espalhar.

O Laravel 13 não é revolução — e isso é ponto forte. Ele dá times PHP uma história crível de IA, camada de API baseada em padrão e dezenas de arestas refinadas: o tipo de release que dá para adotar feature a feature mantendo produção estável.