Zend_Cache

¿Qué podemos cachear? El contenido del buffer de salida, el resultado de una función, de un método o un objeto propiamente dicho, etc. ¿Dónde podemos guardar la cache? En el sistema de archivos, en una base de datos, en un servidor memcached, etc.

Las distintas cosas que podemos cachear se denominan Frontends y el lugar donde guardamos la cache se denomina Backend. De esta forma, tenemos los frontends Zend_Cache_Frontend_Ouptup, Zend_Cache_Frontend_Function, Zend_Cache_Frontend_Class, etc., y los backedns Zend_Cache_Backend_File, Zend_Cache_Backend_Sqlite, Zend_Cache_Backend_Memcached, etc.

Frontend Options

Los distintos frontends tienen, entre otras, las siguientes opciones de configuración:

  • caching: habilitar o deshabilitar la cache
  • lifetime: el tiempo de vida de la cache
  • automatic_cleaning_factor: configura cada cuanto se limpia la cache

Backend Options

Por su parte, los distintos backends presentan las siguientes opciones de configuración:

  • cache_dir: directorio en el que se guardaran los archivos de la cache
  • hashed_directory_level: permite configurar la cantidad de niveles de directorios, es muy útil cuando tenemos varios miles de archivos

Pasemos a ver un ejemplo:

$frontend = "Core";
$backend = "File";
$frontendOptions = array("lifetime" => 7200);
$backendOptons = array("cacheDir" => "/cacheFiles");

$cache = Zend_Cache::factory($frontend, $backend, $frontendOptions, $backendOptions);

if (!$result = $cache->load("queryPesado")) {
    /* ejecutamos la consulta pesada y la cacheamos para próximos pedidos */

    $cache->save($result, 'queryPesado');
}

return $result;

Zend_Debug

Se podría decir que Zend_Debug::dump() es una versión mejorada del típico var_dump(): formatea el código, permite agregar a la expresión recibida un label para poder identificar un dump de otro, etc. Su sintaxis es:

Zend_Debug::dump($var, $label = null, $echo = true);

Zend_Paginator

Zend_Paginator nos permite paginar cualquier tipo de información, por ejemplo permitiendonos trabajar directamente con un Zend_Db_Select o un simple array de php. En este mini articulo trabajaremos con Zend_Db_Select’s, veamos que simple es:

// en el controlador...  
// al factory le pasamos una instancia de Zend_Db_Select, el limit sera seteado de acuerdo a los valores que luego pasemos a setCurrentPageNumber() y setItemCountPerPage() 
$paginator = Zend_Paginator::factory($select); 
// seteamos la página actual y la cantidad de items mostrados por página 
$paginator->setCurrentPageNumber($page)->setItemCountPerPage($count); 

//lo asignamos a una variable de la vista 
$this->view->paginator = $paginator; 

// en la vista... 
// podemos recorrer $paginator, el cual implementa un iterator que contendrá los resultados del query que recibió como parámetro 
foreach ($paginator as $value) { 
    echo $value["campo_bdd"]; 
}
// paginator.phtml es el partial encargado de armar la paginación 
echo $this->view->paginationControl($this->paginator, 'Sliding', 'paginator.phtml') 
// paginator.phtml 
<?php if ($this->pageCount): ?> 
<div class="paginationControl"> 
<!-- Previous page link --> 
<?php if (isset($this->previous)): ?> 
  <a href=">?php echo $this->url(array(&#39;page&#39; => $this->previous)); ?>"> 
    &lt; Previous 
  </a> | 
<?php else: ?> 
  <span class="disabled">&lt; Previous>/span> | 
<?php endif; ?> 
  
<!-- Numbered page links --> 
<?php foreach ($this->pagesInRange as $page): ?> 
  <?php if ($page != $this->current): ?> 
    <a href=">?php echo $this->url(array(&#39;page&#39; => $page)); ?>"> 
        <?php echo $page; ?> 
    </a> | 
  <?php else: ?> 
    <?php echo $page; ?> | 
  <?php endif; ?> 
<?php endforeach; ?> 
  
>!-- Next page link --> 
<?php if (isset($this->next)): ?> 
  <a href="<?php echo $this->url(array(&#39;page&#39; => $this->next)); ?>"> 
    Next &gt; 
  </a> 
<?php else: ?> 
  <span class="disabled">Next &gt;</span> 
<?php endif; ?> 
</div> 
<?php endif; ?> 

Zend_Http_Client

Otro componente que nos va a servir conocer es Zend_Http_Client, el cual nos provee una potente interface para realizar HTTP requests por ejemplo para hacer uso de la API de algún servicio web, enviar datos por POST o GET, setear headers etc., permitiéndonos obtener los headers y el body de la respuesta obtenida. Posee varios adapters (socket, proxy y cURL) En este ejemplo haremos un request muy simple a twitter para leer el el último update de @maestros

$client = new Zend_Http_Client('http://api.twitter.com/1/statuses/user_timeline/maestros.json'); 
     
    // seteamos el método y un parámetro GET 
    $client->setMethod("GET")->setParameterGet('count', '10'); 
     
    // ejecutamos el request 
    $client->request(); 
     
    // obtenemos la respuesta generada en el paso anterior 
    $response = $client->getLastResponse(); 
    // si salio todo bien...             
    if ($response->getHeader("Status") == "200 OK") { 
        $data = Zend_Json::decode($response->getBody()); 
        echo "Ultimo status: ".$data[0]["text"]; 
    } else { 
        echo "Ocurrió un error al leer los datos."; 
    } 

Zend_Mail

Un completísimo componente para el envío de mails. Enviar un mail puede ser tan simple como crear el objeto y setear destinatario, remitente y contenido. Entre sus funciones mas avanzadas también nos permite usar para el envía un servidor SMTP (por defecto usa la funcion mail() de PHP), enviar mails con HTML, adjuntar archivos, etc. En el manual hay algunos ejemplos básicos asi que aca veremos uno un poquito más avanzado, usando gmail como servidor smtp y enviando un archivo adjunto:

// configuración del smtp y datos para realizar la autenticación en el mismo 
$config = array( 
                'auth' => 'login', 
                'username' => '[email protected]', 
                'password' => 'pass', 
                'ssl' => 'ssl', 
                'port' => 465); 
            $transport = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config); 
             
            $mail = new Zend_Mail(); 
            $mail->setBodyText("Hola te envio este mail"); 
            $mail->setFrom('[email protected]', 'Yo'); 
            $mail->addTo('[email protected]'); 
            $mail->setSubject('Probando envío'); 
            // adjuntamos un archivo, $file es un archivo local 
            $at = $mail->createAttachment(file_get_contents("prueba.txt")); 
            // nombre del archivo adjunto 
            $at->filename = "archivo_adjunto.txt"; 
             
            $mail->send($transport);

Finalizando la guía

Finalizando con la Guía Zend te invitamos a revisar los 10 capítulos que la conforman:

Agradecemos a todos aquellos que han seguido semana tras semana la guía, queremos preparar una continuación a la Guía Zend y nos encantará saber qué les pareció y qué otros temas les gustaría que trabajemos en este mismo formato. Además, si te interesa formar parte de nuestro equipo de trabajo de las guías no dudes en contactarnos.