Introducción a Zend Framework

36
Hispavista: Introducción a Zend Framework Zend Framework

description

Curso introductorio a Zend Framework.

Transcript of Introducción a Zend Framework

Page 1: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Zend Framework

Page 2: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

¿Por qué usar un Framework?

Frame = marcoWork = trabajoCualquier que haya pretendido construir una aplicación de envegadura media, ha creado su propio “framework”:Reutilización de códigoFácil Mantenimiento / legibilidadAbstración en la capa de acceso a datos

Utilizar una librería de funciones es utilizar un Framework.

Page 3: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

¿Qué Framework utilizar?

Utilización de framework propio (generalmente)Pros:Agilidad de uso

Alto conocimiento de la estructura

Flexibilidad

Seguridad (por ocultación)

ContrasDesarrollado por un grupo reducido (lento)

Poco testing

Estructura desorganizada

Page 4: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

¿Qué Framework utilizar?

Symphony(mvc, orm, ajax, caching, NO templates...)Bastante soporte

Prado(mvc, orm, ajax, caching, templates, EDP)Complejo

CakePHP(mvc, orm, ajax, caching, NO templates...)Fácil aprendizaje

Zend Framework(mvc, ajax, caching, NO templates, components)Muy Flexible y fácil aprendizaje

Page 5: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

¿Por qué Zend Framework?

Zend Framework es un framework híbridoComponentes usables de modo stand-aloneEs fácil empezar a utilizar Zend al estilo PEAR. Sin cambiar el paradigma de la aplicación existente.

Core MVCImplementación completa del Modelo-Vista-Controlador

Amplio soporte de la comunidadExisten más colaboradores libres, que trabajando para Zend.La comunidad libera componentes que pasan a la incubadora.Utilización de PHPUnit para testing (calidad).

Zend es la empresa detrás del engine PHPSoporte de otras grande empresas como IBM o Google.

Page 6: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Historia de Zend Framework

Junio 2005Comenzó oficialmente el desarrollo

Abril 2006Primera beta pública (0.1.3)

Junio 2007Ver 1.0.0

Actualmente (30 Marzo 2009)Ver 1.7.8

Page 7: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Licencia y Propiedad Intelectual

Licencia estilo BSD (estilo Apache):Permite desarrollar proyectos opensource.Permite desarrollar aplicaciones comerciales.

Cada persona que desarrolle para Zend framework, tiene que firmar un Acuerdo de Licencia de Contribuidor, lo que garantiza que el código estará limpio de direcciones IP.

http://framework.zend.com/license

Page 8: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Conceptos Básicos: Excepciones I

ExcepcionesPeor que una aplicación tenga un error en tiempo de ejecución, es que el usuario vea en su navegador dicho error, mostrando a veces información comprometida con consecuencias para la seguridad.Desde PHP5 se implementaron excepciones en PHP de manera muy similar a otros lenguajes de programación.Clase incorporada en PHP extensible para implementar funciones concretas.

Page 9: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Conceptos Básicos: Excepciones II

<?phpclass Exception{    protected $message = 'Unknown exception';    protected $code = 0;    protected $file;    protected $line;    function __construct($message = null, $code = 0);    final function getMessage();    final function getCode();    final function getFile();    final function getLine();    final function getTrace();    final function getTraceAsString();    function __toString();                       }?>

Page 10: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Conceptos Básicos: Excepciones III

try {  $error = 'Siempre lanzar la excepción';  throw new Exception($error);  Echo “No se ejecuta”;} catch (Exception $e) {  echo 'Excp. Capturada: ' . $e­>getMessage() . "\n";}

class miExcepcion extends Exception {public function mailAdmin();}

try {  $error = 'Siempre lanzar la excepción';  throw new miExcepcion($error);  Echo “No se ejecuta”;} catch (Exception $e) {  echo 'Excp. Capturada: ' . $e­>getMessage() . "\n";  $e­>mailAdmin();}

Page 11: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Conceptos Básicos: MVC I

MVCParadigma de programación nacido en 1978 de la mano de Xerox PARC.Separa el código en 3 partes lógicas:ModeloRepresenta el modelo de datos que va a utilizar la aplicación.

El “sujeto” en una aplicación.

Debe contener toda la lógica de negocio de la aplicación.

VistaContiene la lógica de visualización (XHTML para aplicaciones web).

Mezcla la lógica de datos con las acciones en el controlador, para devolver la salida al usuario.

Page 12: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Conceptos Básicos: MVC II

ControladorRepresenta la acción a ejecutar el modelo de datos que va a utilizar la aplicación.

El controlador para un modelo, podría considerarse como el “verbo”

Desde aquí se invocará la lógica de negocio contenida en el modelo.

Page 13: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Conceptos básicos: Patrón de diseño singleton I

Paradigma de diseño que se asegura de que solamente exista una instancia en ejecución de una clase determinada.Se basa en definir un método estático (getInstance por ejemplo), que a su vez devuelva una variable estática de la misma clase, conteniendo (por referencia), el objeto instanciado.Al tratarse de un método estático, tendremos el mismo objeto en cualquier ámbito de ejecución.

Page 14: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Conceptos básicos: Patrón de diseño singleton II

class ejemplo {private static $object = NULL;

public static function getInstance() {if (self::$object == NULL) {  self::$object = new ejemplo();}return self::object;}}

$a = ejemplo::getInstance();

Page 15: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Conceptos básicos: Interfaces fluidas

Práctica en programación OO que consiste en devolver el objeto en sí en algunos métodos, con el objetivo de “ahorrar” líneas de código.Las llamadas a varios métodos quedarán encadenados (al estilo jQuery por ejemplo)./* .... */ public function getRequest() {/* codigo */return $this;}/* .... */ 

$obj­>getRequest()­>getPost(“name”);

Page 16: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Instalación Zend Framework

Descarga de Zend FrameworkModo descargahttp://framework.zend.com/download

Descargarse la última versión estable (1.7.8)

El contenido dentro de la carpeta “library” será el framework propiamente dicho.

Modo SVNCheckout del último tag disponiblesvn cohttp://framework.zend.com/svn/framework/standard/tags/\ release­1.7.8/library/Zend/ Zend 

Page 17: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Estructura de directorios

Partimos de un directorio donde estarán todos los ficheros web (/var/www por ejemplo)/var/www//var/www/lib/  <­ Contendrá ficheros de terceros/var/www/lib/Zend  <­ Zend Framework/var/www/app1/  <­ Ficheros de nuestra aplicación/var/www/app1/controllers <­Controladores/var/www/app1/models <­ Modelos/var/www/app1/views <­ Vistas/var/www/app1/views/scripts/ <­ contenedora de las vistas /var/www/app1/views/scripts/index <­ un dir / controlador/var/www/app1/views/helpers/ <­ dir para helpers de views

/var/www/htdocs/ <­ Document Root del Apache/var/www/htdocs/images/ <­ directorios web “normales”/var/www/htdocs/css/

Page 18: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Bootstrap I

Fichero que se encarga de redirigir todas las peticiones HTTP a nuestra aplicación./var/www/htdocs/index.phpBootstrap básico:Especificar include path (librerias y aplicación)Esto sólo para entornos en desarrollo; en producción sería deseable que estuviera incluido en el php.ini para temas de rendimiento.

Incluir ficheros principalesrequire_once 'Zend/Loader.php';require_once 'Zend/Controller/Front.php';

Page 19: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Bootstrap II

Añadir un try/catch a toda la ejecuciónInstanciar la clase del controlador principalConfigurar el objeto controlador principaltry {Zend_Loader::loadClass('Zend_Controller_Front');$front = Zend_Controller_Front::getInstance();$front­>throwExceptions(true);// En este ejemplo no utilizaremos views$front­>setParam('noViewRendered',true);$front­>setParam('noErrorHandler',true);$front­>setControllerDirectory('/ruta/controllers');$front­>dispatch();} catch (Exception $e) {header("Content­type: text/html; charset=utf­8");echo "<p>EXCEPCIÓN: ".$exp­>getMessage()."</p>";echo "<pre>".$exp­>getTraceAsString()."</pre>";}

Page 20: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Reescritura de peticiones HTTP I

Es necesario pasar a nuestro bootstrap todas la peticiones de HTTP dinámicas (que deban ser tratadas por nuestra aplicación).Debemos asegurarnos de que modrewrite está activado en nuestro Apache2# a2enmod rewrite# /etc/init.d/apache restart

En desarrollo será suficiente con tener un fichero .htaccess ocupándose de esta tarea.En producción deberemos especificarlo en el fichero de configuración de apache, para mejorar considerablemente el rendimiento.

Page 21: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Reescritura de peticiones HTTP II

Fichero .htaccess sencillo (pero funcional)/var/www/htdocs/.htaccess

# Nos aseguramos de activar el módulo rewriteRewriteEngine On 

# Si el fichero existe, que sea la última peticiónRewriteCond    %{REQUEST_FILENAME}  ­fRewriteRule    .* ­ [L]

# Si el directorio existe, que sea la última peticiónRewriteCond    %{REQUEST_FILENAME}  ­dRewriteRule    .* ­ [L]

# También podíamos resumirlo con una sóla línea# Si la petición NO termina($) por . seguido de una de esas extensiones, redirigir al bootstrapRewriteRule !\.(js|css|jpg|jpeg|png|gif|ico)$ index.php

Page 22: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Controlador I

Será necesario crear el controlador para que el bootstrap anterior funcione correctamente.El controlador se guardará en el directorio controllers de la aplicación./var/www/app1/controllers/BuscarController.php

El controlador será una clase extendida de Zend_Controller_Actionclass BuscarController extends Zend_Controller_Action

Un controlador es entre otras cosas un contenedor de acciones. La acción será un método público dentro de la clase del controlador.public function reservasAction()

Page 23: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Controlador II

Tanto el controlador como la acción se especificarán en la URL.http://www.example.com/buscar/reservasSe usará el controlador buscar, y dentro de éste, la acción reservas.

El controlador por defecto, se denominará index./var/www/app1/controllers/IndexController.php

La acción por defecto se llamará index.<?php// Debemos incluir la clase Zend_Controller_ActionZend_Loader::loadClass('Zend_Controller_Action');class IndexController extends Zend_Controller_Action {public function indexAction() {Echo “hola mundo”;}}

Page 24: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Controlador III

Los métodos en Zend se escriben utilizando camel-caseComenzando en minúscula, las palabras se separan poniendo la

primera letra en mayúscula.El siguiente método dentro de un controlador llamado viajes

(ViajesController.php), sería algo así:class ViajesController extends Zend_Controler_Action {

   public function reservarVueloAction() {}} 

La URL que invocaría dicha acción en el controlador sería, sin embargo, deberá ser e minúsculas, separando las palabras con un guión:

http://example.com/viajes/reservar­vuelo

Page 25: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Vistas I

Una vista especifica normalmente el contenido XHTML que se utilizará para renderizar la página.

También es posible que el resultado sea XML, JSON o incluso contenido binario como una imagen o un PDF.

Las vistas serán específicas para cada *Action de un Controlador.

Las vistas se guardarán dentro del directorio views/scripts/, donde crearemos un directorio con el nombre del controlador, para finalmente poner la vista, con la extensión “.phtml”./var/www/app1/views/scripts/index/index.phtml

Page 26: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Vistas II

El vista como “objeto”, estará disponible dentro como la propiedad “view” dentro del controlador.IndexController.phppublic function IndexController() {   $this­>view­>titulo = “Hola Mundo”;}

Mediante el método mágico __set se creará la propiedad aunque no exista, y estará disponible dentro de la vista.index.phtml<?php echo $this­>titulo ?>

En la vista se puede programar PHP de manera normal, aunque por concepto, no debe contener lógica de negocio.

Page 27: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Vistas III

Escape()Función disponible en la vista, que deberá usarse para evitar

valores malicioso en las variables que llegan a la vista.$this­>escape($valor);

Por defecto, llamará a la función htmlentities.Es configurable desde el controlador mediante el método de la

vista setEscape.$this­>view­>setEscape('funcion_a_medida');$this­>view­>setEscape(array($obj,'metodo_publico');$this­>view­>setEscape(array('clase','metodo_estatico');

Page 28: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Helpers :: Vistas IV

Helpers, o “ayudadores” de vistas, son utilizados para encapsular funciones complejas y/o repetitivas dentro de las vistas.

Existen varios helpers instanciados incialmente en la clase Zend_View FormText();FormSubmit();FormLabel();HtmlList();Etc...

Page 29: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Helpers :: Vistas V

Es posible crear nuestros propios helpers a nuestra medida.

Deben (no siempre) almacenarse siempre en un directorio establecido:/var/www/app1/views/helpers/NombreDelHelper.php

La clase debe denominarse con el prefijo Zend_View_Helper_NombreDelHelper, y el método que se invocará se llamara “NombreDelHelper”.Class Zend_View_Helper_NombreDelHelper {   public function NombreDelHelper($param) {}}

Page 30: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Modelo

Existen varias tendencias a la hora de entender e implementar un modelo de datos:Sin Modelo: donde la lógica de negocio estará encapsulada

dentro del controlador (desaconsejada para aplicaciones de tamaño considerable).

Modelo Ligero: implementa funciones básicas basándose en datos introducidos desde el controlador.

Modelo Pesado: encapsula la lógica de los datos además de la lógica de negocio.

Page 31: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Modelo II

Un Modelo será una clase en el siguiente directorio de nuestro árbol de directorios:/var/www/app1/models/Modelo.php

Esta vez, no tiene que “necesariamente” heredar de ninguna clase del Framework para funcionar.

La estructura de herencias de los modelos será tan compleja como el programador quiera hacerla.

Simplemente debemos añadir la requerir el fichero en el controlador que vaya a utilizar el modelo:require_once 'models/Member.php';

Page 32: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Globals.php I

Clase estática (que sólo contendrá métodos estáticos), que contiene configuraciones globales para toda la aplicación.

Zend Framework reserva un directorio oficial para esta clase:/var/www/app1/config/Globals.php

Deberemos incluirla en el bootstrap para que esté accesible en todos los ámbitos de la aplicación.require_once 'config/Globals.php';

Esta clase sirve como contenedor de objetos globales implementando el patrón singleton.

Page 33: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Globals.php II

require_once 'Zend/Loader.php';Zend_Loader::loadClass('Zend_Db');

class Globals {    private static $_db = NULL;      static public function getDBConnection() {       if (self::$_db === null) {         self::$_db = Zend_Db::factory('Pdo_Mysql',                       array('host'=>'localhost',

             'username'=>'user',             'password'=>pass',             'dbname'=>'db'));

       }        return self::$_db;   }}// Recuperamos la conexión desde cualquier ámbito:$db = Globals::getDBConnection();

Page 34: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Sesiones

Zend utiliza su propia implementación de variables de sesión.

Utiliza un método que delimita un namespace (un índice dentro de $_SESSION), devolviendo en un objeto automático el contenido de esa sesión.Zend_Loader::loadClass(“Zend_Session_Namespace”);

/* … */public funcion *Action() {

$myData = new Zend_Session_Namespace('myData');$myData­>nombre = array(1,2,3);

}

Page 35: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Licencia Copyleft

Copyright

Page 36: Introducción a Zend Framework

Hispavista: Introducción a Zend Framework

Licencia Copyleft

Este documento está protegido bajo la licencia Reconocimiento-SinObraDerivada 2.1 España de Creative Common (http://creativecommons.org/licenses/by-nd/2.1/es/)

Copyright © 2009 Javier Infante <[email protected]>

Se permite la copia, modificación, distribución, usocomercial y realización de la obra, siempre y cuando sereconozca la autoría de la misma, a no sea ser que seobtenga permiso expreso del autor. El autor no permitedistribuir obras derivadas a esta.

Esta nota no es la licencia completa de la obra, sinouna traducción de la nota orientativa de la licenciaoriginal completa (jurídicamente válida).