NOTAS WEB
Automatización de Tareas en Laravel
Aprende a crear una tarea en Laravel con envío de correo incluido, y deja la tarea programada de forma permanente en tu servidor.
Laravel ofrece una herramienta poderosa llamada Task Scheduling que permite automatizar tareas dentro de tus proyectos. En este tutorial aprenderas sobre automatización de tareas en Laravel. Además de como enviar correos electrónicos diarios, en tres pasos esenciales. Adelante!!
CREACIÓN COMANDO
Paso 1: Crear el comando
Para la automatización de tareas en Laravel, lo que primero que necesitamos es crear un comando. Para eso iremos a la terminal y ejecutaremos la siguiente instrucción para crear nuestro comando de Laravel:
php artisan make:command RegisteredVisits --command=regi
El comando anterior creará una clase llamada RegisteredVisits en un archivo con el mismo nombre en la carpeta app/Console/Commands. Al ejecutar el comando Artisan, también le hemos dado un nombre al comando que ejecutará la tarea.
Paso 2: Modificamos el archivo creado
Entramos al archivo que hemos creado en la ruta «app/Console/Commands/RegisteredVisits.php» y modificamos la descripción del comando:
/**
* The console command description.
*
* @var string
*/
protected $description = ‘Envía un correo con las visitas diaria del blog’;
Paso 3: Registramos el comando
Accedemos al archivo «app/Console/Kernel.php» y registramos nuestro archivo:
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
‘App\Console\Commands\RegisteredVisits’,
];
Si ejecutamos el comando «php artisan list» desde la terminal, deberíamos poder ver el comando registrado en el listado, más en concreto en registered.
Paso 4: Creamos el código
Dentro del archivo RegisteredVisits, creamos la consulta que nos dará las visitas diarias.
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$date_now = now()->format(‘Y-m-d’);
$visits = \DB::table(‘logs’)->whereDate(‘created_at’,$date_now)->get();
}
CONFIGURACIÓN MAIL
Paso 1: Crear clase Mailable para el envío de email
php artisan make:mail SendMail
Esto creará el archivo dentro de app/Mail/SendMail.php .
Class SendMail extends Mailable
{
use Queueable, SerializesModels;
public $visits;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($visits)
{
$this->visits = $visits;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view(‘mails.daily-visits’);
}
}
Dentro del archivo, creamos una propiedad $visits, y la inicializamos en el constructor con el parámetro $visits que pasamos al instanciar la clase SandMail. Por último, enviamos los datos desde el método build a la vista.
En mi caso, yo dentro de resources\views tengo creada una carpeta mails, y ahí dentro voy creando las plantillas de correo que voy generando. En este caso la ruta sería :
resources\views\mails\daily-visits.blade.php
Paso 2: Configurar el contenido del correo
En este caso, como es un reporte propio solo voy a incluir un titulo, un par de párrafos y una tabla
<h1><strong> Reporte díario con la visita del blog </strong> </h1>
<p>Hoy, {{now()->format(‘d-m-Y’)}} se han registrado un total de {{count($visits)}} visitas en la web.</p>
<p>Las páginas visitas han sido:</p>
<div>
<table>
<tr class=«bg-indigo-400 bg-opacity-100 text-white»>
<th class=«text-left»>Página</th>
<th class=«text-left»>Fecha</th>
</tr>
<tbody>
@forelse ($visits as $visit)
<tr class=«border-b-2»>
<td> {{$visit->page}} </td>
<td> {{$visit->created_at}} </td>
</tr>
@endforeach
</tbody>
</table>
</div>
Paso 3: Registramos el mail
Accedemos al fichero «app/Console/Commands/RegisteredVisits.php» y agregamos la clase
use Illuminate\Support\Facades\Mail;
use App\Mail\SendMail;
Y en el método handler lo completamos así:
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$date_now = now()->format(‘Y-m-d’);
$visits = \DB::table(‘logs’)->whereDate(‘created_at’,$date_now)->get();
Mail::to(‘blognotasdesarrolloweb@gmail.com’)->send(new SendMail($visits));
}
PROGRAMACIÓN DEL COMANDO
Como la tarea la ejecutaremos una vez al día, usaremos el método «daily()». Para eso debemos registrarlo en el archivo «app/Console/Kernel.php» dentro de la función schedule.
/**
* Define the application’s command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
$schedule->command(‘registered:visits’)->daily();
}
Al método daily() se ejecutará a medianoche. Si quisiéramos que se ejecutará la tarea una vez al día pero en otra hora distinta, habría que usar el método dailyAt pasándole un parámetro de tipo string, con la hora en la que queremos que se ejecute. Ejemplo: ->dailyAt(’13:00′) .
Si quieres saber más sobre los tramos que existen, aquí te dejo el enlace a la documentación de scheduling de Laravel.
Finalmente, desde la consola de comandos de nuestro servidor, ejecutamos el siguiente comando
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
Si lo quieres probar en local (localhost), debes escribir el siguiente comando:
php artisan schedule:run
Si quieres ver si funciona en el momento, puedes cambiar el método daily por everyMinute, así podrás ver si has configurado todo el proceso correctamente. Quedando algo así:
Con estos pasos, has configurado Laravel para automatizar tareas, como enviar un reporte diario de visitas, mejorando la eficiencia de tu aplicación. Laravel Task Scheduling es una herramienta flexible que puede adaptarse a cualquier necesidad de automatización.
Nota: Recuerda configurar correctamente el crontab en tu servidor para que Laravel ejecute el scheduler como está previsto.
Si esta guía te ha sido útil, no dudes en compartirla y ayudar a otros desarrolladores a descubrir el poder de la programación de tareas en Laravel. Si te interesa más contenido relacionado con Laravel, descubre más en este enlace. Y si tienes trucos propios o quieres compartir tu experiencia con la programación de tareas en Laravel, déjanos un comentario o síguenos en nuestras redes sociales. ¡Juntos podemos construir aplicaciones más inteligentes y eficientes! 😉 👍
Desarrollador de software con más de 7 años de experiencia, especializado en desarrollo web y backend. Con habilidades demostradas en PHP, Laravel, Symfony, y una amplia gama de tecnologías modernas. Apasionado por el diseño y desarrollo de software.
Buenisimo. Muchas gracias por la info.
Gracias Pablo por tus comentarios!