Activar y desactivar el modo depuración en Laravel

Activar y desactivar el modo depuración en Laravel
Respuesta rápida

El modo depuración se ajusta con APP_DEBUG en el fichero .env: true en local, false en producción, siempre. Comprueba el estado real con php artisan about --only=environment. Si el cambio no surte efecto, la configuración está en caché: lanza php artisan config:clear.

El modo depuración decide lo que ve un visitante cuando tu aplicación revienta: el stack trace completo con el código fuente y las variables de entorno, o una página de error neutra. Es un ajuste de una línea, pero también una de las fugas de datos más habituales en producción.

Artículo del itinerario Desarrollo web. Verificado en Laravel 13.30.1 con PHP 8.4.25.

Activar y desactivar

El ajuste se hace en el fichero .env, en la raíz del proyecto, y en ningún otro sitio:

.env
APP_ENV=local
APP_DEBUG=true

Para desactivarlo, pon el valor a false:

.env
APP_ENV=production
APP_DEBUG=false

Comprueba el estado efectivo sin escribir una sola línea de código:

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

Es la única comprobación que cuenta: muestra el valor que la aplicación usa de verdad, caché incluida.

La trampa: la configuración en caché

Pones APP_DEBUG=false, recargas y las trazas de error siguen apareciendo. Casi siempre es la caché de configuración.

Cuando se ha ejecutado php artisan config:cache, Laravel escribe todos los valores resueltos en bootstrap/cache/config.php y deja por completo de leer el fichero .env. El comportamiento está medido:

Paso config('app.debug') env('APP_DEBUG')
APP_DEBUG=true, sin caché true true
tras config:cache y cambio a false en el .env true NULL
tras config:clear false false

Dos lecciones. La primera: después de cualquier cambio en el .env en un servidor donde la configuración está en caché, hay que regenerarla.

bash
php artisan config:clear
# o, en producción, regenerar directamente la caché
php artisan config:cache
env() devuelve NULL cuando la configuración está en caché

Es la consecuencia menos conocida, y no afecta solo a la depuración. Una llamada a env('MA_CLE') fuera de un fichero de config/ devolverá null en cuanto haya pasado config:cache. La regla es estricta: env() únicamente en config/, y en cualquier otro sitio config('fichier.cle').

Qué contiene config/app.php

La clave de configuración se limita a leer la variable de entorno, con false como valor de reserva:

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

No toques esa línea. Está escrita para que el comportamiento por defecto sea seguro: si APP_DEBUG no aparece en el .env, el modo depuración se queda desactivado. Comprobado borrando la variable: config('app.debug') devuelve efectivamente false.

Poner el valor a fuego en config/app.php tiene dos inconvenientes: el fichero está versionado, así que el ajuste se va a todos los entornos, y el .env pasa a ser engañoso.

Los valores aceptados siguen las reglas de conversión de Laravel, medidas línea a línea:

En el .env config('app.debug')
APP_DEBUG=true o (true) o 1 true
APP_DEBUG=false o 0 false
APP_DEBUG=yes true
variable ausente false

yes vale true porque la cadena no se reconoce como booleano y acaba casteada. Es una buena razón para ceñirse a true y false.

Por qué false en producción no se negocia

Con APP_DEBUG=true, la página de error muestra la traza de llamadas, extractos del código fuente y el contenido de las variables de entorno cargadas. Un visitante que provoque un error puede leer, por tanto, tus credenciales de base de datos, tus claves de API y la clave APP_KEY que cifra las sesiones.

Ni siquiera hay que buscar: basta con una URL que provoque una excepción. Es la razón por la que aparecen aplicaciones Laravel comprometidas sin ningún fallo aplicativo concreto.

La configuración correcta de un servidor de producción, como el que se monta en la instalación de Laravel en Debian, cabe en tres líneas:

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

Después, una vez desplegado:

bash
php artisan config:cache
php artisan about --only=environment   # comprobación: Debug Mode debe mostrar OFF

El mismo razonamiento vale para los formularios públicos, que conviene proteger contra los envíos automatizados antes de abrirlos al público.

Los errores se siguen pudiendo consultar, pero en los logs y no en el navegador:

bash
tail -f storage/logs/laravel.log

Esa ruta se construye con storage_path(), descrito en las rutas de la aplicación.

Errores frecuentes

La caché de configuración ignora el .env Después de config:cache, Laravel ya no lee el fichero .env. Cualquier cambio exige config:clear o regenerar la caché.
env() fuera de config/ En cuanto la configuración está en caché, env() devuelve NULL en cualquier otro sitio. Usa config('fichier.cle').
Modificar config/app.php en vez del .env El fichero está versionado: el ajuste se va a todos los entornos y el .env pasa a ser engañoso.
APP_DEBUG=yes vale true Cualquier cadena que no se reconozca como booleano se castea a true. Cíñete a true y false.
APP_DEBUG=true en producción La página de error expone la traza, el código fuente y las variables de entorno, incluidas las credenciales de la base y la APP_KEY.

ConfigurationLaravelPHP

Damien Flandrin Desarrollador web desde 2010, creador de Gekkode y de Email Impact. Cada artículo se prueba en un proyecto real antes de publicarse. Contacto
Newsletter

Las nuevas pruebas, tutoriales y proyectos, por correo.

Pruebas reproducibles, código versionado, resultados fechados. Nunca spam.