Migrar a la estructura de Laravel 11: routes/console.php, configuración y cierre
Hola, bienvenido. En esta última lección vamos a terminar la migración a la estructura de Laravel 11 y, con ella, el curso. En Laravel 11, las tareas programadas se definen en routes/console.php con la fachada Schedule, y los comandos de app/Console/Commands se registran solos, así que app/Console/Kernel.php sobra. Lo vamos a mover y a borrar, junto con la línea provisional que dejamos en bootstrap/app.php en la lección 11, y después vamos a repasar la configuración: el array providers de config/app.php, los archivos de config/ y el .env.example.
Es la lección con menos código de la sección, pero tiene una decisión importante, que es qué no cambiar: nuestros archivos de config/ y nuestro .env.example no son los de un proyecto nuevo de Laravel 11, y vamos a ver por qué en un proyecto que ya existe es mejor dejarlos como están.
La tarea programada, en routes/console.php
Nuestro Kernel de consola hace 2 cosas. En schedule() programa el comando tickets:close-stale cada hora, y en commands() carga los comandos de app/Console/Commands y el archivo routes/console.php. En Laravel 11, las 2 tienen otro sitio:
En app/Console/Kernel.php |
En Laravel 11 |
|---|---|
$schedule->command('tickets:close-stale')->hourly() en schedule() |
Schedule::command('tickets:close-stale')->hourly() en routes/console.php |
$this->load(__DIR__.'/Commands') en commands() |
Lo hace Application::configure(), que registra los comandos de app/Console/Commands |
require base_path('routes/console.php') en commands() |
El parámetro commands de withRouting() |
La fachada Schedule es lo que permite definir las tareas en routes/console.php, sin una clase que las agrupe, y tiene los mismos métodos que el objeto $schedule que recibía el Kernel. Por eso el cambio es casi literal. Vamos a añadir la tarea al final de routes/console.php, con su use:
Si prefieres que routes/console.php tenga solo comandos, la documentación de Laravel 11 ofrece una alternativa, withSchedule() en bootstrap/app.php, que recibe una función con el mismo objeto $schedule del Kernel. Aquí seguimos el esqueleto, que deja las tareas en routes/console.php.
Ahora, bootstrap/app.php. Vamos a quitar la línea que en la lección 11 registraba nuestro Kernel de consola, y con ella la variable $app, y a añadir commands a withRouting() para que Laravel cargue routes/console.php, que hasta ahora cargaba el Kernel:
Ya es el bootstrap/app.php de un proyecto de Laravel 11, con lo propio del nuestro en cada sección. Y como nadie usa ya app/Console/Kernel.php, vamos a borrarlo:
Vamos a comprobar que la tarea sigue programada y que el comando sigue registrado:
Y el test que lo vigila, CloseStaleTicketsTest, que comprueba que el comando cierra los tickets y que está programado cada hora:
En producción no cambia nada: el cron sigue lanzando php artisan schedule:run cada minuto, y Laravel encuentra la tarea en su sitio nuevo.
- 02El array providers de config/app.php
- 03Los archivos de config/ y config:publish
- 04El .env.example
- 05composer qa y el tag laravel-11
- 06Lo que hemos hecho y lo que queda