Archive for the 'zend framework' Category

PHPUnit en MVC con ZendFramework. Test unitarios

cito a Rodrigo Corral en la conferencia de “Metodologías ágiles y Calidad del software”:

“..antes de ponermos a inplantar metodologías de trabajo, tenemos que tener la costumbre de crear Test Unitarios para todo lo que programemos.” (no son palabras textuales :] )

Lamentablemente en PHP, la cosa de los TestUnitarios está casi en pañales y es una teréa bastante engorrosa la de crear un test unitario para cada componente que creemos.

PHPUnit, nos intenta facilitar este trabajo con una fántastica herramienta para poder testear nuestras clases.

weierophinney.net está creando una herramienta(aún está en la incubadora) para poder probar las funcionalidades de nuestras aplicaciones con Zend Framework que utilizan MVC.

¿Qué podremos probar con esta herramienta?

  • Si la acción no dio lugar a un redireccionamiento, en caso de éxito, redireccionarlo
  • Presencia de determinadas cabeceras de respuesta HTTP y / o su contenido
  • ¿Qué módulo, controlador, y / o acción se utilizó en la última interacción del bucle de envío?
  • ¿Cuál fue la ruta seleccionada?

Enlace a: Testing Zend Framework MVC Applications

Configuración básica para aplicaciones en Zend Framework

un tutorial bastante introductorio para crear una aplicación con ZendFramework.

enlace: http://es.wikibooks.org/wiki/Zend_Framework/Configuracion_Basica

Enviando correo con Zend_Mail

enlace:

From Swift Mailer to Zend_Mail

tiene varios ejemplos y casos de uso; muy útil para quien todavía no a utilizado esta clase

Proyecto 004:: SIVideo, prealfa funcional

Como comente en un post anterior; estoy haciendo una aplicación para poder mostrar contenido multimedia de servidores públicos(youtube, flickr, …)

Por fin he podido sacar una primera versión(pre-alfa) con soporte para sonido, video e imágenes; me fue difícil empezar, más que nada porque me cuesta empezar con algo abstracto. Decidí empezar con algo practico y escogí un grupo de música y les hice la página con todos lo contenidos que encontraba en los servidores públicos.

Elegí el grupo de música La calle 13 (podría haber cogido cualquier otro) y ya tengo la primera versión; aunque voy a cambiar radicalmente la estructura de desarrollo; más que nada porque creo que es absolutamente necesario mejorar los tiempos de respuesta; es más lentos de lo que esperaba. En la siguiente versión, que trabajaré este fin de semana.

Aquí os presento:

En la próxima versión lo pondré todo en ajax, instalaré un sistema de cache para agilizar las peticiones; cambiaré el diseño web.

Hasta la próxima; que os contaré los problemillas que he tenido al crear la aplicación; un bug en Zend_Service_Flickr (que solucioné), bug en el sistema de cache con Zend_Cache_File

Integrando Doctrine en Zend Framework

En mi fugas relación con Symfony descubrí Doctrine; me dejo bastante impresionado, pero luego en la practica se me quedaba demasiado grande para los proyectos que tenía.

Para los que no sepan que es Doctrine; este diagrama dirá mucho más, que lo que escriba:

Esto lo podemos integrar en ZF, para que se encargue de todo el modelo de abstracción de la base de datos, dejando a Zend_Db, archivado en la librería.

Enlace al tutorial para integrar Doctrine en Zend Framework: Integrating Zend Framework and Doctrine
creado por Ruben Vermeersch

Zend PHP Certification Practice Test Book, en PDF

En mi cruzada para prepararme la certificación me pedí el libro de practicas para el examen, lo pedí en Amazon pero está tardando más de lo normal. Dado que mi paciencia es bastante limitada, me he puesto a buscar por la red si encontraba algo y me acabo de encontrar con todo el el libro en PDF listo para descargar o echarle un vistazo cada X tiempo y hacer unas preguntas así en plan rápido.

leer: Zend PHP Certification Practice Test Book

también recomiendo mirar está búsqueda que seguro hay algo interesante para vosotros.

4 enlaces, 3 tutoriales un plugin

Tutoriales de Zend framework

Ejemplo de aplicación con Zend Framework

En la Wiky de ZF hay una aplicación de demostración para ver la utilización de Zend_Layout y Zend_View.

descargar: demo-website-zlayout-zve-0.1.tar.gz
enlace: Zend_Layout and Zend_View Enhancements Demo

Login y autentificación con Zend Framework

Traducción del original: Login and Authentication with Zend Framework de Matthew Weier O’Phinney.

Me han enviado una sería de preguntas de personas que quieren saber como se maneja la autentificación y la persistencia(* de sesión) de usuarios con Zend Framework. El típico problema es no estar seguro como combinar:

  1. Un adaptador de autentificación
  2. Formulario de acceso
  3. Controlador de Loggin y Logout
  4. Comprobar usuario en posteriores peticiones

No es demasiado difícil, pero necesitas saber trabajar con MVC y la utilización de Zend_Auth. Vamos a echar un vistazo.

Adaptador de autentificación

Para que esto funcione necesitas un adaptador de autentificacion(* Zend_Auth). No voy a entrar en detalles sobre esto; podrá encontrar más información en la documentación oficial, el uso varia según el sitio. Voy a imaginar que un adaptador de autentificación necesita un nombre de usuario y contraseña como información de autentificación. nuestro formulario de acceso utilizará este adaptador, sino simplemente tener un lugar de recuperación.

Formulario de acceso

El formulario es bastante simple. Puedo configurar algunas de las reglas de validación para prevenir errores en la consulta de la base de datos, pero de una menra relativamente simple. Para los propositos de este tutorial, vamos a definir los siguientes criterios: -el nombre del usuario debe ser sólo caracteres alfabéticos, y contener entre 3 y 20 caracteres -la contraseña constará de caracteres alfanuméricos, y debe tener entre 6 y 20 caracteres. el formularios sería algo así:

class LoginForm extends Zend_Form
{
public function init()
{
$username = $this->addElement(‘text’, ‘username’, array(
‘filters’ => array(‘StringTrim’, ‘StringToLower’),
‘validators’ => array(
‘Alpha’,
array(‘StringLength’, false, array(3, 20),
),
‘required’ => true,
‘label’ => ‘Your username:’,
));

$password = $this->addElement(‘password’, ‘password’, array(
‘filters’ => array(‘StringTrim’),
‘validators’ => array(
‘Alnum’,
array(‘StringLength’, false, array(6, 20),
),
‘required’ => true,
‘label’ => ‘Password:’,
));

$login = $this->addElement(’submit’, ‘login’, array(
‘required’ => false,
‘ignore’ => true,
‘label’ => ‘Login’,
));

// We want to display a ‘failed authentication’ message if necessary;
// we’ll do that with the form ‘description’, so we need to add that
// decorator.
$this->setDecorators(array(
‘FormElements’,
array(‘HtmlTag’, array(‘tag’ => ‘dl’, ‘class’ => ‘zend_form’)),
array(‘Description’, array(‘placement’ => ‘prepend’)),
‘Form’
));
}
}

Controlador de Loggin

ahora vamos a crear el controlador para el Login y Logout. Las caractaristica típicas sería así:

  1. Usuario rellena el formulario de acceso
  2. Usuario envía el formulario
  3. El controlador haría lo siguiente:
  4. Responde con los errores en caso de encontrarlos.
    -El éxito de la validación redirecciona a la página principal.
    -El usuario registrado(exitosamente) se redirige a la página principal.
  5. -salida del suario, por petición de este, a la página del formulario de acceso.

El controlador de Login(LoginController) hará uso del adaptador de autentificación elegido. así como el formulario de acceso. Vamos a pasar al formulario de acceso, contruir el formulario y el método de la acción. Cuando tengamos valores válidos, se lo pasa a nuestro adaptador de autentificación. Así que vamos a crear el controlador. En primer lugar, le vamos a crear el formulario y el adaptador de autentificación.

class LoginController extends Zend_Controller_Action
{
public function getForm()
{
return new LoginForm(array(
‘action’ => ‘/login/process’,
‘method’ => ‘post’,
));
}

public function getAuthAdapter(array $params)
{
// Leaving this to the developer…
// Makes the assumption that the constructor takes an array of
// parameters which it then uses as credentials to verify identity.
// Our form, of course, will just pass the parameters ‘username’
// and ‘password’.
}
}

Luego tenemos que verificar los envios, antes de caulquier cosa para ganrantizar los siguiente: -si el usuario ya está auntentificado,(* y a salido por algun motivo y vuelve a entar) hay que redirigirle a la página(*sin que haga nada) -El usuario no está auntentificado, porque ha cerrado la seción, hay que redirigirle a la página de acceso. La siguiente rutina”preDispatch()” lo hará por nosotros.

class LoginController extends Zend_Controller_Action
{
// …

public function preDispatch()
{
if (Zend_Auth::getInstance()->hasIdentity()) {
// If the user is logged in, we don’t want to show the login form;
// however, the logout action should still be available
if (‘logout’ != $this->getRequest()->getActionName()) {
$this->_helper->redirector(‘index’, ‘index’);
}
} else {
// If they aren’t, they can’t logout, so that action should
// redirect to the login form
if (‘logout’ == $this->getRequest()->getActionName()) {
$this->_helper->redirector(‘index’);
}
}
}
}

ahora tenemos que hacer nuestro formulario de acceso. Este es el metodo más simple que recupera el constructor el formulario y lo pinta en la salida del (x)html.

class LoginController extends Zend_Controller_Action
{
// …

public function indexAction()
{
$this->view->form = $this->getForm();
}
}

El procesamiento del formulario implica un poco más de lógica. tenemos que verificar que tenemos un puesto de petición, luego que el formulario sea válido y por último que los datos sean validos.

class LoginController extends Zend_Controller_Action
{
// …

public function processAction()
{
$request = $this->getRequest();

// Check if we have a POST request
if (!$request->isPost()) {
return $this->_helper->redirector(‘index’);
}

// Get our form and validate it
$form = $this->getForm();
if (!$form->isValid($request->getPost())) {
// Invalid entries
$this->view->form = $form;
return $this->render(‘index’); // re-render the login form
}

// Get our authentication adapter and check credentials
$adapter = $this->getAuthAdapter($form->getValues());
$auth    = Zend_Auth::getInstance();
if (!$auth->isValid($adapter)) {
// Invalid credentials
$form->setDescription(‘Invalid credentials provided’);
$this->view->form = $form;
return $this->render(‘index’); // re-render the login form
}

// We’re authenticated! Redirect to the home page
$this->_helper->redirector(‘index’, ‘index’);
}
}

Por ultimo, podemos añadir la acción de cerrar sesion. estó es tan simple como borrar los datos de autentificación. <<CODIGO seis>> Bueno, es todo para nuestro controlador de autentificación

class LoginController extends Zend_Controller_Action
{
// …

public function logoutAction()
{
Zend_Auth::getInstance()->clearIdentity();
$this->_helper->redirector(‘index’); // back to login page
}
}

Comprobación de los usuarios autentificados

La úlima parte de la pregunta es: ¿Cómo determinar si un usuario está autentificado, y restringir el acceso si no? Si se mira con detenimiento el método “preDispatch()” en las lineas anteriores(más arriba) se puede ver ya la forma de hacerlo. Zend_Auth persiste en la identificación de posteriores sesiones, lo que le permitirá consultar directamente utilizando esta construcción: Zend_Auth:: getInstance () -> hasIdentity () Puede utilizar esto para determinar si el usuario está conectado y, a continuación, utilizar el redireccionamiento para redirigirle a la página de acceso si no está conectado. Puede tirar de la identidad del objeto Auth. $ Identidad = Zend_Auth:: getInstance () -> getIdentity (); Esto podría ser colocado en un Helper para mostrar el estado de la utentificación. por ejemplo:

/**
* ProfileLink helper
*
* Call as $this->profileLink() in your layout script
*/

class My_View_Helper_ProfileLink
{
public $view;

public function setView(Zend_View_Interface $view)
{
$this->view = $view;
}

public function profileLink()
{
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$username = $auth->getIdentity()->username;
return ‘<a href=”/profile’ . $username . ‘”>Welcome, ‘ . $username‘</a>’;
}

return ‘<a href=”/login”>Login</a>’;
}
}

Conclusión

Zend_Auth hace un montón de trabajo por detrás de las escenas para que la persistencia de una identidad en el periodo de sesiones sea trivial. Combínalo con Zend_Form(* si de verdad te vale) y podrás implementarlo fácilmente para la recuperación y validación de los usuarios. Añade utilidades(*preDispatch()) en el Zend_Controller() y se puede restringir el acceso a las apliaciones, basados en la autentificicación.

Entradas siguientes »