Laravel 13 na prática: menos retrabalho para construir sistemas melhores
Filas, cache, APIs, IA e busca por significado: veja como o Laravel 13 ajuda a resolver dores de sistemas e como aproveitar o PHP 8.5 nessa combinação.
As vozes dependem do navegador e do dispositivo; algumas precisam de internet. Blocos de código não são narrados.
No artigo sobre o PHP 8.5, vimos melhorias que deixam o código mais fácil de acompanhar. Agora vamos subir um andar e conversar sobre o Laravel 13.
Se você mantém um sistema, provavelmente conhece a cena: a funcionalidade parece simples, mas logo aparecem as filas, a API, o cache, a busca e aquela integração de IA que entrou na lista de pedidos. Quando percebe, boa parte do tempo foi para a estrutura que faz tudo isso funcionar.
O Laravel 13 traz novidades úteis para essa rotina. Lançado em 17 de março de 2026, ele exige PHP 8.3 no mínimo e tem o PHP 8.5 entre as versões oficialmente suportadas. Vale entender a combinação: o PHP é a linguagem que executa a aplicação; o Laravel oferece a estrutura e as ferramentas para organizá-la.
Vamos aos problemas que essas novidades ajudam a resolver, com exemplos de sistemas de verdade.
Notas oficiais do Laravel 13 e compatibilidade com PHP.
1. Filas: cada tarefa no lugar certo, sem espalhar configuração
Imagine uma importação de milhares de produtos e um e-mail de confirmação. Você quer organizar esses trabalhos em filas diferentes, com processos preparados para cada carga.
O Laravel já tinha filas. A novidade do 13 é Queue::route(), que permite centralizar o destino padrão de cada classe de job.
Considerando que os dois jobs já existam e implementem ShouldQueue, este é um trecho do AppServiceProvider:
use App\Jobs\ImportarProdutos;
use App\Jobs\EnviarConfirmacao;
use Illuminate\Support\Facades\Queue;
public function boot(): void
{
Queue::route(
ImportarProdutos::class,
connection: 'redis',
queue: 'importacoes',
);
Queue::route(
EnviarConfirmacao::class,
connection: 'redis',
queue: 'emails',
);
}
A dor que diminui: repetir a escolha de fila em todos os lugares que disparam uma tarefa. Se a organização mudar, existe um ponto central para ajustar esses padrões.
A conexão Redis e os workers, que são os processos que executam os trabalhos, precisam estar configurados. O roteamento define destinos; a capacidade de processamento depende da infraestrutura. Configurações explícitas de um job também podem sobrescrever o padrão.
Documentação de filas e conexões.
Queue::route centraliza o destino padrão de cada classe de job. Os workers precisam estar configurados para atender as filas. Ilustração didática produzida para ernani.dev.
2. Cache: dar mais tempo a uma informação que continua útil
O usuário enviou uma planilha, o sistema preparou uma prévia da importação e agora ele está conferindo os dados. Faz sentido manter essa prévia temporária disponível enquanto a conferência continua.
Com Cache::touch(), você pode renovar a expiração de um item existente sem buscar e gravar seu conteúdo novamente:
use Illuminate\Support\Facades\Cache;
$renovado = Cache::touch(
'preview:importacao:42',
now()->addMinutes(15),
);
Nesse exemplo, se a chave existir, o novo vencimento fica definido para daqui a 15 minutos. O retorno informa se a operação funcionou.
Onde ajuda: prévias temporárias, resultados intermediários e outros dados que ainda são válidos, mas precisam de um novo prazo de permanência.
Há uma diferença importante entre renovar a validade e atualizar a informação: touch() não recalcula o conteúdo. E, se a chave já expirou, retorna false; reconstruir a prévia continua sendo tarefa da aplicação.
Documentação de renovação do cache.
3. APIs: menos discussão sobre o formato de cada resposta
Quem já integrou sistemas conhece o problema: um endpoint devolve o produto dentro de data, outro mistura atributos com metadados e um terceiro organiza os relacionamentos de outro jeito. O aplicativo consumidor precisa aprender todas essas variações.
O Laravel 13 inclui recursos JSON:API, voltados a uma especificação que padroniza essa estrutura. Para criar um recurso nesse formato, existe o comando php artisan make:resource ProdutoResource --json-api.
Um exemplo de classe:
namespace App\Http\Resources;
use Illuminate\Http\Resources\JsonApi\JsonApiResource;
class ProdutoResource extends JsonApiResource
{
public $attributes = [
'nome',
'preco_centavos',
];
}
Com o model do produto carregado, o controller pode retornar new ProdutoResource($produto), usando a classe importada. O recurso organiza a resposta segundo JSON:API e define o cabeçalho correspondente.
A dor que diminui: reinventar o contrato de resposta a cada endpoint, especialmente quando vários aplicativos ou equipes consomem a mesma API.
O suporte é específico ao padrão JSON:API. Ele cuida da serialização das respostas; filtros e ordenação de consultas recebidas ainda precisam de implementação ou ferramentas adicionais.
Documentação de recursos JSON:API.
4. IA no sistema com uma interface mais consistente
Vamos imaginar um recurso para resumir descrições de produtos. A ideia é pequena, mas pode render bastante código de integração se cada serviço de IA entrar no projeto de um jeito diferente.
Um dos destaques do ecossistema que acompanha o Laravel 13 é o Laravel AI SDK. Esse pacote oficial oferece uma interface comum para trabalhar com agentes, geração de texto e outros recursos de IA.
Depois de instalar laravel/ai e configurar um provedor com suas credenciais, um exemplo simples fica assim:
use function Laravel\Ai\agent;
$resposta = agent(
instructions: 'Resuma a descrição em uma frase clara. '
.'Use apenas as informações fornecidas.',
)->prompt(
'Suporte articulado para celular, com ajuste de ângulo '
.'e base para uso sobre a mesa.'
);
echo (string) $resposta;
Onde ajuda: resumos de chamados, sugestões de descrição e assistentes que trabalham com informações do próprio sistema. A estrutura comum reduz o código específico de cada integração.
O SDK é um pacote separado, e os recursos disponíveis variam conforme o provedor. Atualizar o framework não configura a IA automaticamente. O texto gerado também merece conferência antes de ser utilizado.
Documentação do Laravel AI SDK.
5. Busca: encontrar o produto mesmo quando o cliente usa outras palavras
O catálogo diz “organizador de cabos”. O cliente pesquisa “algo para organizar os fios da mesa”. Dependendo da implementação, uma busca baseada apenas na coincidência de palavras pode deixar passar um resultado útil.
O Laravel 13 oferece suporte a consultas vetoriais que ajudam a construir buscas por significado. Elas usam embeddings: representações numéricas do conteúdo que permitem comparar similaridade.
Com os produtos já preparados e seus embeddings armazenados, uma consulta pode ser:
use Illuminate\Support\Facades\DB;
$produtos = DB::table('produtos')
->whereVectorSimilarTo(
'embedding',
'algo para organizar os fios da mesa',
)
->limit(5)
->get(['id', 'nome']);
A dor que diminui: exigir que a pessoa adivinhe exatamente as palavras usadas no cadastro.
Esse exemplo pressupõe coluna vetorial, embeddings compatíveis, Laravel AI SDK e provedor configurado. Ao receber uma string, o recurso gera o embedding da consulta. Também é necessário um banco compatível, como PostgreSQL com a extensão pgvector.
Os resultados dependem dos dados, do modelo e dos ajustes da busca. O cenário acima ilustra uma aplicação possível; a qualidade deve ser avaliada com pesquisas reais dos usuários.
Documentação de busca semântica e vetorial.
6. E onde o PHP 8.5 entra nessa história?
O Laravel cuida de boa parte da organização da aplicação, e o PHP 8.5 oferece recursos que você pode usar na lógica escrita dentro dela.
Um exemplo é combinar o operador pipe com uma função do Laravel para transformar o nome de um produto em um slug, aquele texto amigável usado em endereços:
use Illuminate\Support\Str;
$slug = ' Kit de ferramentas '
|> trim(...)
|> (fn(string $nome) => Str::slug($nome));
echo $slug; // kit-de-ferramentas
O fluxo fica explícito: receber o nome, retirar espaços das pontas e gerar o slug. Str::slug() é uma ferramenta do Laravel que já existia; |> é o recurso introduzido pelo PHP 8.5.
Por isso, esse trecho exige PHP 8.5, mesmo que o Laravel 13 também funcione com versões anteriores da linguagem dentro da faixa suportada. Confirme a versão usada pelo servidor web, pelo terminal e pelos workers.
Também dá para aproveitar os recursos de clonagem, arrays e avisos de retorno que expliquei no artigo anterior sobre PHP 8.5, conforme eles fizerem sentido no projeto.
Documentação do pipe no PHP e de strings no Laravel.
Atualizar com um objetivo deixa tudo mais simples
Minha sugestão é escolher uma dor concreta para começar: organizar as importações, padronizar uma API ou melhorar a busca de um catálogo. Assim, fica mais fácil avaliar o benefício da atualização no seu sistema.
Antes de mudar o ambiente de produção, confira a compatibilidade das dependências e exercite os fluxos principais em testes. Login, APIs, filas, cache e integrações são bons candidatos. O guia oficial de atualização para o Laravel 13 detalha as mudanças que merecem atenção.
A combinação Laravel 13 + PHP 8.5 abre boas oportunidades para reduzir tarefas repetitivas e escrever uma aplicação mais fácil de manter. Cada recurso pode entrar onde resolve um problema real, sem transformar a atualização em uma obrigação de reescrever tudo.
E, convenhamos: quanto menos tempo gasto repetindo configuração, mais tempo sobra para desenvolver aquilo que o usuário realmente pediu.
Qual dessas melhorias resolveria uma dor do seu sistema hoje?