Manejando el error 404 con el Zend Framework

Zend FrameworkTras adoptar la plataforma de desarrollo de Zend al programar tus aplicaciones, una de las primeras dudas que surgen es cómo manejar el caso de las páginas no encontradas con esta filosofía. En principio el Framework deja total libertad al programador y únicamente muestra un error o excepción “Invalid controller specified” . Tras la adición del sistema de plugins, esta se convierte en una de las formas más fáciles de controlar este tipo de errores. Por ejemplo:

class Mi_Controller_Plugin_NoRoute
   extends Zend_Controller_Plugin_Abstract
{
   function preDispatch(Zend_Controller_Request_Abstract $request)
   {
       $frontController = Zend_Controller_Front::getInstance();
       $dispatcher = $frontController->getDispatcher();

       if (!$dispatcher->isDispatchable($request))
       {
           $request->setControllerName('index');
           $request->setActionName('noroute');
       }
   }
}

De esta forma (propuesta por Rob Allen), lo que hacemos es redirigir todos los errores 404 al controlador “Index” y a la acción “noroute”. Así podemos manejarlos en un único lugar para toda la aplicación.

Otra de las alternativas propuestas (en mi opinión menos elegante) es la siguiente:

try {
	$front->dispatch();
} catch (Exception $e) {
	require_once dirname(__FILE__) . '/../application/Core/controllers/IndexController.php';
	$controller = new IndexController($front->getRequest(), $front->getResponse());
	if ($e instanceof Zend_Controller_Dispatcher_Exception) {
		$controller->error404Action();
	} else {
		throw $e;
	}
	$response = $front->getResponse();
	/* @var $response Zend_Controller_Response_Abstract */
	echo $response->__toString();
}

En esta ocasión, lo que hacemos es capturar la excepción del tipo Zend_Controller_Dispatcher_Exception que es lanzada cuando no se encuentra el controlador o la acción especificadas en la url.

Personalmente prefiero la primera opción, ya que me parece mucho más versatil y elegante y puede usarse para manejar otro tipo de errores parecidos. De hecho es la que uso en mis proyectos (aunque con algunas modificaciones). Pero sólo es una preferencia personal, ya que la segunda opción también permite capturar distintos tipos de excepciones y dispone de las mismas posibilidades.

Mientras más proyectos hago basados en este Framework, más me gusta la potencia y sobre todo la versatilidad y libertad que te ofrece. Pero lo que más me gusta es que programar en php ha dejado de ser monótono y ahora vuelve a ser muuy divertido ;)

Zend Framework 0.8.0, ya queda menos

El equipo de Zend, nos trae una nueva entrega de su nuevo Framework, version 0.8.0., con las siguientes novedades:

  • Componentes que han salido de la incubadora:
    Zend_Auth, Zend_Console_Getopt, Zend_Filter, Zend_Mail_Read, Zend_Rest_Client, Zend_Rest_Server, Zend_Validate
  • Mejoras:
    soporte de aplicaciones modulares MVC, Zend_Date, Zend_Db, Zend_Db_Select, Zend_Locale, Zend_Session
  • Importantes mejoras en rendimiento:
    Zend_Search_Lucene
  • Nuevos componentes:
    Zend_Environment for reporting PHP runtime environment (incubator), Zend_Log fully object-oriented redesign (incubator), Zend_Service_Akismet client for spam-filtering web service
  • Otras mejoras para probar las entregas y la documentación..

Y ya nos queda menos para la 1.0 ;). A los que vayais a probarlo en una aplicacion que tengais con la 0.7.0 o inferior, cuidado porque han cambiado el nombre de algunas clases (por ejemplo el Zend_Controller_RewriteRouter ahora pasa a llamarse Zend_Controller_Router_Rewrite). Para más info, teneis una guia de migración.

Descargarselo.
Lista de cambios.

Zend Framework 0.7.0

Justo ayer hablaba del Zend Framework. Pues hoy mismo nos deleitan con una nueva versión, la 0.7.0 (ya estamos más cerca de la 1.0). Que además nos llega con localización (L10N) e internacionalización (I18N), dos de las características más esperadas por muchos (entre ellos, yo), ya que van a permitir desarrollar aplicaciones multi-idioma/multi-localización .

* Locale-management component
* Locale-aware Date parsing and formatting class
* New translation-management component with gettext support
* Comprehensive class for working with measurements and conversions
* New prototype class for filtering and validation parameters
* New class for managing memory usage in PHP applications
* Many other improvements in current components such as MVC, Session, Gdata, HTTP Client, Search, XmlRpc, and others
* Many other enhancements to test suites and documentation.

Yo me pongo ahora mismo a probarlo ;).
Teneis más info en la página oficial del Zend Framework

Zend Framework 0.60 – diagrama

Para todos los que usamos el Zend Framework como plataforma de desarrollo de nuestras aplicaciones, Alex nos echa una mano y nos muestra un diagrama del funcionamiento inicial del sistema:

Impreso y pegado en la pared. Gracias Alex.

Por cierto, para los que esteis comenzando con este framework, os recomiendo este magnifico tutorial de Zend Framework.

Evitar que usen nuestros formularios para Spam

Últimamente todos los que programamos en PHP y no hemos sido muy precavidos, nos estamos encontrando con constantes ataques (o intentos) de spammers, que intentan usar nuestros formularios para aumentar sus ventas de viagra ;).
Oscar desde surlandia nos ilustra sobre el tema con su artículo: “Evitar spam en formularios PHP“. Altamente recomendable.

Cinco errores comunes al programar con base de datos en PHP

Para aquellos que esteis comenzando con la programación usando base de datos y para los que llevais un tiempo pero no teneis una base sólida, los chicos de IBM nos traen un excelente artículo: “Five common PHP database problems“.
En el nos detallan cinco casos comunes de programación incorrecta de aplicaciones con base de datos. Sobre todo se centran en la base de datos más usada en la web: MySQL, pero valdría practicamente para cualquier gestor de bases de datos relacional.

Yo añadiría un problema con el que me he encontrado frecuentemente al resolver problemas en aplicaciones creadas por terceros: no definir los datos de conexión como una variable (o constante) global a la aplicación. De esta forma, si la aplicacion es trasladada a otra máquina donde no podemos conseguir el mismo nombre de base de datos y o usuario, nos vemos obligados a hacer el típico “search & replace” (buscar y reemplazar) para modificar todas las apariciones de la cadena de conexión (esto siendo optimistas y pensando que siempre se ha escrito de la misma forma).

En los proyectos más simples, yo suelo crear un archivo “config.php” que todos los demás scripts cargan en su inicio ( include (‘config.php’); ) y que contiene la cadena de conexión a la base de datos. Por ejemplo:

<?php
define ('DB_DSN', 'mysql://usuario:clave@localhost/basedatos');
?>