Cómo descargar archivos remotos con Silex, Symfony y Drupal 8

Author Top
enzo

Como nuevo desarrollador de Silex y Symfony, Encuentro muy interesante algunos componentes disponibles para su uso con Silex y Symfony. Hoy quiero hablarte de Guzzle y Zippy, voy a mostrar cómo utilizar tanto para descargar y manejar archivos zip / gz remotos en su aplicación.

1. Instalación con composer.

En primer lugar, tenemos que añadir la dependencia en nuestro fichero composer.json como se puede ver en el siguiente fragmento.

{
    "require": {
        "guzzlehttp/guzzle": "~6.1.1",
        "alchemy/zippy": "0.2.*@dev"
    }
}

Después de incluir estas nuevas dependencias que debe ejecutar la actualización composer como se puede ver en la siguiente sentencia de bash.

$ composer update

2. Uso en Silex/Symfomy

Con esos nuevos vendors (como se conoce a la librerias de terceros), sólo es resta utilizarlos, como se puede ver en el siguiente código.

<?php

use Alchemy\Zippy\Zippy;
use GuzzleHttp\Client;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
Now inside any method of your class is possible to request to create a client of Guzzle, in general terms Guzzle is like a headless browser.

$client =  new Client();

// Destination file to download the release
$destination = tempnam(sys_get_temp_dir(), 'file.') . "tar.gz";

// Get and save file
$client->get($remote_zip_file_path, ['save_to' => $destination]);

// Handle Zip file to extract in your system
$zippy = Zippy::load();
$archive = $zippy->open($destination);
$archive->extract('./');

try {
  $fs = new Filesystem();
  $fs->rename($remote_zip_file_name, './' . $new_folder_name);
} catch (IOExceptionInterface $e) {
  print 'Error renaming folder';
}

En el código anterior estamos asumiendo que tenemos la ruta al archivo y el nombre, además queremos cambiar el nombre de la carpeta después de extraer. El código también podría mejorarse incluyendo una sección try ... catch para el proceso de extracción.

Como se puede ver es una tarea compleja como la que normalmente se manejan por CURL pero como se puede ver Guzzle es más potente y su aplicación es más fácil de entender.

3. Uso en Drupal

Como ahora Drupal 8 incluye varios componentes de Symfony y otros componentes útiles, el código anterior podría ser reescrito utilizando un wrapper de Drupal 8, déjame mostrarte la implementación.

use Drupal\Core\Archiver\ArchiveTar;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;

$client =  new Drupal::httpClient();

// Destination file to download the release
$destination = tempnam(sys_get_temp_dir(), 'file.') . "tar.gz";

// Get and save file
$client->get($remote_zip_file_path, ['save_to' => $destination]);

// Handle Zip file to extract in your system
$archiver = new ArchiveTar($destination, 'gz');
$archiver->extract('./');
fclose($destination . '.tar.gz');

try {
  $fs = new Filesystem();
  $fs->rename($remote_zip_file_name, './' . $new_folder_name);
} catch (IOExceptionInterface $e) {
  print 'Error renaming folder';
}

Como se puede ver es similar y que no tiene que modificar el archivo composer.json Drupal 8, para incluir componentes debido a que ya se incluyen en el core de Drupal 8.

Si desea comprobar una implementación completa de esta lógica, se puede comprobar el código fuente del proyecto Drupal console de los comandos module:download y site:new

Espero que hayas encontrado este artículo útil.