Crear comandos que nos permiten ejecutar acciones manuales desde la consola, es una herramienta que necesitamos más comúnmente de lo que parece, por eso crear un comando en Laravel, es una buena opción que agiliza el desarrollo.
Hablo por supuesto desde mi humilde experiencia.
El desarrollo me he exigido que además de las herramientas de testeo, en muchos casos correr directamente comandos de Artisan, para comprobar el funcionamiento en vivo de funciones o métodos construidos, como parte del proceso de creación de una aplicación.
En este ejemplo muestro como crear un comando Artisan, que va a conectarse a un base de datos y hacer una inserción según un momento determinado en ella.
Llamaremos a nuestro comando importar.
En la consola dentro del root de nuestro proyecto creamos el comando:
php artisan make:command Importar
Como crear un componente en Laravel
Esto creará nuestro comando, si vamos ahora a la ruta
app/Console/Commands/importar.php,
el archivo Commands, que se crea al correr
make:command
tendrá dentro los datos del comando creado.Dentro del comando hay varias zonas importantes:
La primera es la variable $signature, que es donde daremos el nombre con que llamaremos al comando en la consola
protected $signature = 'importar';
La segunda es la variable descripción, allí escribiremos la descripción de la razon de ser del comando que aparecerá cuando listemos los comandos de Artisan
protected $description = 'Insertar productos en la Base de datos';
La tercera zona importante es la función handle en la cual desarrollaremos la lógica.
public function handle() {// $archivos = \Storage::disk('listos')->files(); $ultimo = end($archivos); $contenido_Exp = \Storage::disk('listos')->get($ultimo); $contenido_Exp = json_decode($contenido_Exp); //dd($contenido_Exp[2]->codigo); /* ->get(); */ //dd($archivo); function hora_exportar($sitio, $hora) { $hora = date("H.i.s"); $hora_deseada = DB::table('sitios')->hora_deseada; if ($hora === $hora_deseada){ $sitio = DB::table('sitios')->nombre; $host = DB::table('sitios')->host_conex; $username = DB::table('sitios')->usuario_bd; $passwd = DB::table('sitios')->pass_bd; $dbname = DB::table('sitios')->nombre_bd; } } /* $host ="154.53…."; $username = "admin_bd "; $passwd= "Hlnv68?"; $dbname= "bd_pt";*/ // $consulta = ; $enlace = mysqli_connect($host,$username,$passwd,$dbname); /* if ($mysqli_ping($enlace)){ printf("conexion bien"); } else{ printf("error de conexion");} mysqli_close($enlace);*/ if(!$enlace){ echo "Error no se pudo conectar".PHP_EOL; echo "Errno de depuracion:".msqli_connect_errno().PHP_EOL; echo "Errno de depuracion:".msqli_connect_error().PHP_EOL; exit; } echo "realizada conexion exitosa".PHP_EOL; echo "info del host:".msqli_get_host($enlace).PHP_EOL; mysqli_close($enlace); //insertamos en nuestra bd los datos de la ultima exportacion $insertar_exportacion = DB::table('importaciones')->insert([ 'users_id' => 1, 'estados_id' => '3', 'proveedores_id' =>'1', 'sitios_id' => $ultimo, 'url_archivo' => $url, 'nombre_archivo' => $url, 'tipo_archivo' =>$tipo, 'tamaño' =>'1', ]); }
En nuestro ejemplo tenemos una columna en la bd llamada hora deseada, que compareremos con la hora actual del servidor, si el valor es igual ejecutaremos la consulta.
El ultimo paso para que el comando funcione es declararlo en el archivo kernel.php dentro de la ruta App/Console, dentro de los comandos protegidos
protected $commands = [
// Commands\Importar::class, ];
Y en la función Schedule, tenemos la opción de configurar la ejecución su ejecución periódicamente, podríamos también colocar una tarea en el servidor de llamar esta función, a una hora especifica, en nuestro caso la colocaremos aquí diaria.
protected function schedule(Schedule $schedule) { $schedule->command('Importar') ->daily(); }
Esto es todo, no obstante debemos decir que la recomendación de Laravel es que los comandos sean ligeros para no cargar demasiado la ejecución del sistema en si y como una buena práctica de programación.
La mejor opción es aprovechar la reusabilidad, y utilizar ese mismo código dentro de un controlador, ejecutándolo de modo periódico, y así dejar la ejecución del comando solo para tareas manuales.
Y listo, esto es todo.
Espero modestamente que este artículo, sirva de ayuda a alguien.
Gracias.
…todo lo que se contiene, termina desbordándose……