Crear un comando en Laravel

logo laravel

Crear comandos que nos permiten ejecutar acciones manuales desde la consola,  es una herramienta que necesitamos mas comúnmente de lo que parece, hablo por mi 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 

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……

Comandos de Artisan

logo laravel

La potencia  de Artisan para aquellos que ya entienden algo de Laravel, es indiscutible, al menos para mi y lo considero de gran ayuda.

Artisan posee un conjunto de comandos, que permiten que pueda aprovecharse muy bien su capacidad. Para listar estos comandos basta con escribir en la consola

  php artisan list 

e inmediatamente obtendremos:

Las opciones que disponibles con cada comando, pueden obtenerse mediante  help:

php artisan help nombre-comando 

o acortando simplemente con -h:

php artisan nombre-comando -h

Así obtendremos: la forma de usar el comando, sus argumentos , una descripción y las opciones que podemos agregar. Por ejemplo, para php artisan migrate -h  nos muestra:

Aquí nos está diciendo dice que “mígrate” es el comando para correr las migraciones y entre las opciones con que cuenta está poder indicar cuál es la base de datos por ejemplo php artisan migrate –database=tests .

Una de las grandes ventajas de esta herramienta es que tiene un conjunto de comandos dedicado a generadores, es decir, que nos permiten crear elementos como controladores, middleware, seeders, modelos, entre otros, los cuales son los que están bajo la categoría make:


Cada uno de esos generadores tiene sus propias opciones, así que puedes revisarlo con el comando help.

Artisan nos permite crear controladores sin métodos, mediante el uso de la opción plain:

php artisan make:controller PostController --plain

Abajo muestro una lista de algunos de los comandos de uso  más común.

Serve:

php artisan serve

Se utiliza para lanzar el servidor de una aplicación,  corriéndolo desde el root de nuestra app.

Este servidor viene incluido en laravel y se levanta de modo individual para cada  caso. Después de cargarlo, nos indicará donde está corriendo.   

laravel development server started on http://localhost:8000/

Si vamos al navegador, y visitamos  http://localhost:8000/,  veremos nuestra aplicación corriendo.

Para detener el servidor, utilizaremos la combinación de  las teclas Ctrl+C.  

Cambiar el namespace de la aplicación:

php artisan app:name nombre-namespace

Ver el listado completo de rutas: 

php artisan route:list


Como resultado nos mostrará un listado de todas las rutas de la aplicación, con la información sobre el método HTTP, la URI, la acción, el nombre y sus  middlewares.

Poner en modo mantenimiento nuestra aplicación:

php artisan down

Sacar la aplicacion del modo mantenimiento

php artisan up

Artisan además asimila crear comandos, lo cual es muy útil para ejecutar tareas manuales o testear comportamientos.

Crear una tabla

php artisan make:migration
create_posts_table --create posts 

Correr la migracion

php artisan migrate

Modificar una tabla existente

De este modo estariamos agregando el campo “resumen” a la tabla “articulos”

php artisan make:migration add_resumen_to_articulos_table --table="articulos"

Agregar varios campos nuevos a la tabla “users”

php artisan make:migration add_fields_to_users_table
--table="users"

Generar una llave para hashing

php artisan key:generate

Crear un middleware

Por ejemplo escribir esto para crear un middleware que verifique si el usuario tiene una sesión

php artisan make:middleware HasUserASession

Crear un modelo

El siguiente comando creara el modelo Tarea

php artisan make:model Tarea

Crear un controlador

Crear un controlador de recursos tipo REST (resource), que incluye todos los métodos del CRUD(create, read, update, delete)

php artisan make:controller TareaController --resource

Generar el código boilerplate para autenticación de usuarios

Este comando debería ejecutarse lo más pronto al iniciar tu proyecto ya que re-escribirá tus layouts y controladores de Autenticación y Usuarios

 php artisan make:auth

Y listo, esto es todo.

Espero modestamente que este artículo, sirva de ayuda a alguien.

Gracias.

Subir montañas hermana hombres……