Ejercicio 6. Mi primer datasource. Consultas al API de YouTube

Hola visitante, ¿qué tal la semana? En este post vamos a hacer lo mismo que hicimos en 5. Listado de YouTube con SimpleXML de esta categoría, YouTube y CakePHP. Esta vez, sin embargo, en vez de implementar la lógica en un controlador, como hicimos aquella vez, abstraeremos el servicio web de YouTube en un datasource. Esta idea nace del artículo Datasources, Models, Components, Behaviors de Felix Geisendörfer, gracias a la respuesta que obtuve en este hilo del Grupo Google CakePHP en español.

¿Qué es un datasource?

Los desarrolladores de CakePHP han creado varios recursos que sirven para extender la funcionalidad de las diferentes partes de una estructura MVC con el objetivo de mantener bien organizado el código de los modelos, las vistas y los controladores.

En efecto, cuánto más crece la complejidad de una aplicación, es más difícil mantener bien organizado el código de los archivos. Los helpers, por lo tanto, ayudan a mantener bien organizado el código de las vistas; los componentes, el de los controladores; finalmente, los datasources y los behaviors nos ayudan con los modelos.

Funcionamiento de los datasources

Como hemos dicho, los datasources extienden la funcionalidad de los modelos para que estos últimos no tengan que preocuparse de montar las consultas SQL y de realizar las operaciones de conexión con la base de datos. En otras palabras, los datasources actúan como una capa situada entre el modelo y la fuente de datos (MySQL, PostgreSQL, Oracle, XML, etc).

Veamos cómo trabajan juntos el modelo y el datasource a través de un ejemplo concreto en que la fuente de datos es una base de datos MySQL. En este caso, el modelo ejectua una de sus  funciones (find, por ejemplo); el datasource la recoge, arma una cadena SQL y se conecta a la base de datos; a continuación, el datasource recoge el conjunto resultado de MySQL, le da formato y devuelve el resultado al modelo.

Creación del datasource YoutubeSource

Del mismo modo que los helpers se crean en la carepta app/views/helpers y los controladores se crean en app/controllers/components, los datasources se crean en la carpeta app/models/datasources.

Nuestro datasource para YouTube es este:


class YoutubeSource extends DataSource{
   var $description = 'Fuente de datos YouTube';
   var $respuestaYoutube;
   function __construct($config=null){
      parent::__construct($config);
      $this->connected = $this->connect();
      return $config;
   }
   function __destruct(){
      $this->connected = $this->close();
      parent::__destruct();
   }
   function connect(){
      $apiURL = 'http://gdata.youtube.com/feeds/api/standardfeeds/most_viewed';
      $ch = curl_init();
      $timeout = 0;
      curl_setopt($ch, CURLOPT_URL, $apiURL);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
      $this->respuestaYoutube = curl_exec($ch);
      curl_close($ch);
      if (!$this->respuestaYoutube){
         return false;
      } else {
         return true;
      }
   }
   function close(){
   }
   function read(){
   }
   function query(){
   }
   function describe(){
   }
   function column(){
   }
   function isConnected(){
   }
   function showLog(){
   }
   function videosMasVistos(){
      App::import('Core','Xml');
      return Set::reverse(new Xml($this->respuestaYoutube));
   }
}

He seguido el capítulo 14 del libro Beginning CakePHP From Novice to Professional de David Golding para hacer este ejercicio. En él, David Golding nos indica que es necesario definir un esqueleto mínimo con las funciones __construct(), __destruct(), connect(), close(), read(), query(), describe(), column(), isConnected() y showLog().

YoutubeSource implementa el método connect() y hace una llamada al API REST de YouTube para obtener el feed Atom con la información de los vídeos más vistos. Por otra parte, como veremos un poco más adelante cuando creemos el modelo YouTube, también implementa el método videosMasVistos(). 

La clase del datasource se llama YoutubeSorce y tiene que guardarse en el archivo youtube_source.php de la carpeta app/models/datasources.

Incluir nuestro datasource en app/config/database.php

Del mismo modo que los ayudantes y los componentes se incluyen en las matrices $helpers y $components del controlador, respectivamente, los datasources se definen en la clase DATABASE_CONFIG de app/config/database.php.

Efectivamente, para incluir el datasource que acabamos de crear en nuestra aplicación CakePHP podemos escribir lo siguiente justo después de la declaración de $default:


var $youtube = array(
  'datasource' => 'youtube'
 );

Creación del modelo Youtube y del método feedsMasVistos()

Ahora tenemos que crear la tabla youtubes en nuestra base de datos y el modelo YouTube en app/models/youtube.php.


class Youtube extends AppModel{
   var $name = 'Youtube';
   function videosMasVistos(){
      $this->setDataSource('youtube');
      $youtube = $this->getDataSource();
      return $youtube->videosMasVistos();
   }
}

Último paso: llamar al método videosMasVistos en el controlador y crear la vista

Finalmente, ya podemos probar nuestro datasource. Para ello tenemos que llamar desde el controlador al método videosMasVistos() del modelo YouTube:


$this->set('feedAtom', $this->Youtube->videosMasVistos());

También hay que crear la vista app/views/youtube/mas_vistos.ctp para mostrar el resultado en la pantalla:

[/sourcecode language='php']

echo ‘<h3>Los videos más vistos son…</h3>’;
foreach ($feedAtom->entry as $entry){
echo $entry->title.'<br/>’;
}

[/sourcecode]

¡Y esto es todo! Espero que este post te haya gustado, lo encuentres útil, y te sirva para dar tus primeros pasos con los datasources.

Anuncios

5 comentarios

  1. Just passing by.Btw, you website have great content!

    ______________________________

  2. Llevaba tiempo tu web en mis Marcadores y hoy haciendo una limpieza he podido echarle un vistazo y justamente me encuentro este artículo de un tema que estaba buscando información (en book.cakephp, no dicen nada). Darte las gracias por dedicar tu tiempo a compartir esta información.

    Saludos!

  3. Con Zendtube se pueden subir, eliminar y obtener informacion de videos de youtube usando php

    http://www.codigoendesarrollo.com/subiendo-videos-a-youtube-con-php-zendtube-y-api-youtube/2009/03/20/

    Saludos

  4. Hola tus aportes son muy interesantes pero me gustaria saber como hacer un mantenimiento con base de datos en mysql

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: