Modo de depuração no Laravel: ativar e desativar o APP_DEBUG

Modo de depuração no Laravel: ativar e desativar o APP_DEBUG
Resposta rápida

O modo de depuração define-se com APP_DEBUG no ficheiro .env: true em local, false em produção, sempre. Confirma o estado real com php artisan about --only=environment. Se a alteração não fizer efeito, a configuração está em cache: corre php artisan config:clear.

O modo de depuração decide o que um visitante vê quando a tua aplicação rebenta: o rastreio completo com o código-fonte e as variáveis de ambiente, ou uma página de erro neutra. É uma definição de uma linha, mas é também uma das fugas de dados mais frequentes em produção.

Artigo do percurso Desenvolvimento web. Verificado em Laravel 13.30.1 com PHP 8.4.25.

Ativar e desativar

A definição faz-se no ficheiro .env, na raiz do projeto, e em mais lado nenhum:

.env
APP_ENV=local
APP_DEBUG=true

Para o desativar, passa o valor a false:

.env
APP_ENV=production
APP_DEBUG=false

Confirma o estado efetivo sem escrever uma única linha de código:

bash
php artisan about --only=environment
code
  Environment ........................................................ local
  Debug Mode ...................................................... ENABLED

É a única verificação que conta: mostra o valor realmente usado pela aplicação, cache incluída.

A armadilha: a configuração em cache

Passas APP_DEBUG=false, recarregas, e os rastreios de erro continuam a aparecer. É quase sempre a cache de configuração.

Quando o php artisan config:cache foi executado, o Laravel escreve todos os valores resolvidos em bootstrap/cache/config.php e deixa completamente de ler o ficheiro .env. O comportamento foi medido:

Etapa config('app.debug') env('APP_DEBUG')
APP_DEBUG=true, sem cache true true
depois de config:cache, com passagem a false no .env true NULL
depois de config:clear false false

Duas lições. A primeira: depois de qualquer alteração ao .env num servidor onde a configuração está em cache, é preciso regenerá-la.

bash
php artisan config:clear
# ou, em produção, regenerar diretamente a cache
php artisan config:cache
env() devolve NULL quando a configuração está em cache

É a consequência menos conhecida, e não diz respeito apenas à depuração. Uma chamada a env('MA_CLE') fora de um ficheiro de config/ devolve null assim que o config:cache tiver corrido. A regra é estrita: env() apenas em config/, e em todo o resto config('ficheiro.chave').

O que contém o config/app.php

A chave de configuração limita-se a ler a variável de ambiente, com false como valor de recurso:

config/app.php
'debug' => (bool) env('APP_DEBUG', false),

Não mexas nesta linha. Está escrita para que o comportamento por predefinição seja seguro: se o APP_DEBUG não existir no .env, o modo de depuração fica desativado. Verificado ao remover a variável: config('app.debug') devolve mesmo false.

Fixar o valor diretamente no config/app.php tem dois inconvenientes: o ficheiro está versionado, por isso a definição segue para todos os ambientes, e o .env passa a ser enganador.

Os valores aceites seguem as regras de conversão do Laravel, medidas linha a linha:

No .env config('app.debug')
APP_DEBUG=true ou (true) ou 1 true
APP_DEBUG=false ou 0 false
APP_DEBUG=yes true
variável ausente false

yes vale true porque a cadeia não é reconhecida como booleano e acaba convertida. É uma boa razão para te limitares a true e false.

Porque é que false em produção não se negoceia

Com APP_DEBUG=true, a página de erro mostra o rastreio de chamadas, excertos do código-fonte e o conteúdo das variáveis de ambiente carregadas. Um visitante que provoque um erro pode assim ler as tuas credenciais da base de dados, as tuas chaves de API e a chave APP_KEY que cifra as sessões.

Não é preciso procurar muito: basta um URL que provoque uma exceção. É por isso que há aplicações Laravel comprometidas sem qualquer falha aplicacional em particular.

A configuração correta de um servidor de produção, como o que é montado na instalação do Laravel em Debian, cabe em três linhas:

.env
APP_ENV=production
APP_DEBUG=false
APP_URL=https://exemple.com

Depois, uma vez feito o deploy:

bash
php artisan config:cache
php artisan about --only=environment   # verificação: Debug Mode deve mostrar OFF

O mesmo raciocínio vale para os formulários públicos, que é preciso proteger contra os envios automatizados antes da abertura ao público.

Os erros continuam consultáveis, mas nos registos e não no navegador:

bash
tail -f storage/logs/laravel.log

Este caminho constrói-se com storage_path(), descrito em os caminhos da aplicação.

Erros frequentes

A cache de configuração ignora o .env Depois de config:cache, o Laravel deixa de ler o ficheiro .env. Qualquer alteração exige config:clear ou uma regeneração da cache.
env() fora de config/ Assim que a configuração está em cache, o env() devolve NULL em todo o resto. Usa config('ficheiro.chave').
Modificar o config/app.php em vez do .env O ficheiro está versionado: a definição segue para todos os ambientes e o .env passa a ser enganador.
APP_DEBUG=yes vale true Qualquer cadeia não reconhecida como booleano é convertida para true. Limita-te a true e false.
APP_DEBUG=true em produção A página de erro expõe o rastreio, o código-fonte e as variáveis de ambiente, entre elas as credenciais da base de dados e a APP_KEY.

ConfigurationLaravelPHP

Damien Flandrin Programador web desde 2010, criador da Gekkode e do Email Impact. Cada artigo é testado num projeto real antes de ser publicado. Contacto
Newsletter

Os novos testes, tutoriais e projetos, por e-mail.

Testes reproduzíveis, código versionado, resultados datados. Nunca spam.