[El comercio]php zend framework (speech)

151
Introducción a PHP Zend Framework Ernesto Anaya Ruiz [email protected]

description

En la primera ronda de capacitaciones internas en El Comercio me invitaron a hablar sobre Zend Framework. Les comparto las diapositivas.

Transcript of [El comercio]php zend framework (speech)

Page 1: [El comercio]php zend framework (speech)

Introducción a PHP Zend Framework

Ernesto Anaya Ruiz [email protected]

Page 2: [El comercio]php zend framework (speech)

AGENDA

Page 3: [El comercio]php zend framework (speech)

Agenda

Definiciones

Comparaciones con otros Frameworks

Anatomía de una Aplicación Zend

Recomendaciones para lograr Mantenibilidad

Recomendaciones para lograr Alta Disponibilidad

Recomendaciones de Seguridad

Page 4: [El comercio]php zend framework (speech)

DEFINICIONES

Page 5: [El comercio]php zend framework (speech)

Agenda

Definiciones • Framework

• ¿Qué es un Framework? • Problemas comunes que resuelven los Frameworks • Tipos

• Zend • Componentes • Filosofía • Proceso de Calidad ZF • Usos

• MVC Comparativas otros Frameworks Anatomía de una Aplicación Zend Recomendaciones para lograr Mantenibilidad Recomendaciones para lograr Alta Disponibilidad Recomendaciones de Seguridad

Page 6: [El comercio]php zend framework (speech)

¿Qué es un Framework?

Page 7: [El comercio]php zend framework (speech)

¿Qué es un Framework?

Page 8: [El comercio]php zend framework (speech)

¿Qué es un Framework?

• Herramientas

• Conceptos

• Prácticas

• Criterios

Enfocados en resolver ciertos tipos de problemas

Page 9: [El comercio]php zend framework (speech)

Framework

• Un conjunto estandarizado de conceptos, prácticas y criterios para enfocar un tipo de problemática particular, que sirve como referencia para enfrentar y resolver nuevos problemas de índole similar.

Page 10: [El comercio]php zend framework (speech)

Problemas comunes

• Persistencia de Datos

• Validación de Formularios

• Autenticación

• E-mailing

• Seguridad

• Routing

• Cache

• Log

• WebServices

• Manejo de Sesión

• ACL

• Configuración

• Manejo de Excepciones

• Búsquedas

• Paginado

• Etc…

Page 11: [El comercio]php zend framework (speech)

No Reinventemos la rueda

Page 12: [El comercio]php zend framework (speech)

• Zend Framework es un framework de código abierto para desarrollar aplicaciones web, servicios web, scripts con PHP5.

• Zend Framework es una implementación que usa código 100% orientado a objetos.

• Cada componente está construido con una baja dependencia de otros componentes.

• Zend Framework ofrece un gran rendimiento y una robusta implementación MVC.

• Licencia BSD. Business friendly

• Documentación en muchos idiomas

• >80% code covered por pruebas unitarias

Page 13: [El comercio]php zend framework (speech)
Page 14: [El comercio]php zend framework (speech)

Componentes de ZF

• MVC

• Database

• I18N

• Auth y ACL

• Web Services

• Mail, Formats, Search

• Utilitarios

• Zend_Controller – Front Controller – Router – Dispatcher – Action Controller – Plugins y Helpers – Request y Response

• Zend_View – PHP-based views – Helpers

• Zend_Layout • Zend_Form

Page 15: [El comercio]php zend framework (speech)

Componentes de ZF

• MVC

• Database

• I18N

• Auth y ACL

• Web Services

• Mail, Formats, Search

• Utilitarios

• Zend_Db_Adapter

– Adaptadores para la mayoría de extensiones de PHP

• Zend_Db_Profiler

• Zend_Db_Select

• Zend_Db_Table

– Zend_Db_Table_Rowset

– Zend_Db_Table_Row

Page 16: [El comercio]php zend framework (speech)

Componentes de ZF

• MVC

• Database

• I18N

• Auth y ACL

• Web Services

• Mail, Formats, Search

• Utilitarios

• Zend_Locale

• Zend_Date

• Zend_Measure

• Zend_Currency

• Zend_Translate – Adaptadores

• PHP Arrays

• CVS

• Gettext

• Qt

• Tmx

• Xliff

Page 17: [El comercio]php zend framework (speech)

Componentes de ZF

• MVC

• Database

• I18N

• Auth y ACL

• Web Services

• Mail, Formats, Search

• Utilitarios

• Zend_Auth – Zend_Db_Table Adapter – HTTP Digest – Ldap – Escribe tu propio

adaptador

• Zend_Sesion – Zend_Sesion_Storage

• Zend_Acl – Roles – Resources – Rights (Privilegios)

Page 18: [El comercio]php zend framework (speech)

Componentes de ZF

• MVC

• Database

• I18N

• Auth y ACL

• Web Services

• Mail, Formats, Search

• Utilitarios

• Zend_Http_Client • Zend_Rest_Client • Zend_Services

– Amazon ,Delicious, Ebay, Flickr, ReCaptcha, ShortUrl, Technorati, Twitter, WindowsAzure, Yahoo, etc.

• Zend_Feed – Rss y Atom

• Zend_Gdata – Books, Docs, Calendar, Picasa,

Youtube

• Zend_Soap • Zend_Json_Server • Zend_XmlRpc

Page 19: [El comercio]php zend framework (speech)

Componentes de ZF

• MVC

• Database

• I18N

• Auth y ACL

• Web Services

• Mail, Formats, Search

• Utilitarios

• Zend_Mail

• Zend_Mime

• Zend_Pdf

• Zend_Search_Lucene

– Compatibilidad con Apache Lucene

Page 20: [El comercio]php zend framework (speech)

Componentes de ZF

• MVC

• Database

• I18N

• Auth y ACL

• Web Services

• Mail, Formats, Search

• Utilitarios

• Zend_Cache

• Zend_Config

• Zend_Console_Getopt

• Zend_Filter

• Zend_Loader

• Zend_Log

• Zend_Registry

• Zend_Validate

Page 21: [El comercio]php zend framework (speech)

Componentes de ZF

• MVC

• Database

• I18N

• Auth y ACL

• Web Services

• Mail, Formats, Search

• Utilitarios

Y mucho más

Page 22: [El comercio]php zend framework (speech)

• Frameworks

• Full Stack

• Microframeworks • Component Library

• Content Management System

Sepamos diferenciar:

Page 23: [El comercio]php zend framework (speech)

• Frameworks

• Full Stack

• Zend Framework

• Symfony

• CakePHP

• CodeIgniter

• Etc…

• Microframeworks

• Limonade - http://limonade-php.github.com/

• Slim - http://www.slimframework.com/

• Flight - http://flightphp.com/

• Silex - http://silex.sensiolabs.org/

• Component Library

• PEAR

• Zend Framework

• Symfony (v2)

• eZ Components

• Content Management System

• Drupal

• Joomla

Ejemplos

Page 24: [El comercio]php zend framework (speech)

Filosofía de Zend Framework • Simplicidad y Extensibilidad

– Soluciones fáciles para el 80% de la funcionalidad comúnmente requerida en una aplicación web.

– La extensibilidad nos posibilita una fácil adecuación al 20% restante

– No hay complejos archivos XML de configuración

• Buenas practicas Ágiles y Orientadas a Objetos – Arquitectura Use-at-Will

– Full Stack Framework

– Diseñado para Extensibilidad

– Unit tested

Page 25: [El comercio]php zend framework (speech)

Proceso de Calidad ZF 1. Cuéntanos que es lo que propones

1. Redactar el Proposal Document

2. Impleméntalo 1. Escribe código OO que implemente tu propuesta

2. Escribe las pruebas unitarias, Si usas TDD, aun mejor

3. Documenta cómo funciona

3. Verifica que cumple con la propuesta 1. Publica tu implementación para la revisión de la comunidad

2. Obtener Feedback e introducir mejoras.

3. Revisión del Zend-Team para validar conformidad

Enlace Proposals: http://framework.zend.com/wiki/display/ZFPROP/Home

Page 27: [El comercio]php zend framework (speech)

Patrón MVC

Page 28: [El comercio]php zend framework (speech)

COMPARACIONES CON OTROS FRAMEWORKS

Page 29: [El comercio]php zend framework (speech)

Agenda

Definiciones

Comparaciones con otros Frameworks

• Cuadro Comparativo

• Pros & Cons ZF

Anatomía de una Aplicación Zend

Recomendaciones para lograr Mantenibilidad

Recomendaciones para lograr Alta Disponibilidad

Recomendaciones de Seguridad

Page 30: [El comercio]php zend framework (speech)

CakePHP CodeIgniter Symfony Yii ZF

Licencia MIT OSL MIT New BSD BSD

Inicio 2005-08 2006-01 2005-10 2008-01 2006-03

PHP 5.2+ 5.1+ 5 5.1+ 5.2.4+

MVC Si Si Si Si Si

I18n Si Incompleto Si Si Si

ORM Active Record Data Maper

Third Party Only Doctrine, Propel DAO, Active Record

Zend_Db

Testing Si Next Release Si Si

Si

Seguridad ACL Si Plugin ACL, RBAC. Plugins

ACL

Templates Si Si Si Si Si

Caché Si Si Si Si Si

Scaffolding Si No Si Si No

Fuente: http://en.wikipedia.org/wiki/Comparison_of_web_application_frameworks

Page 31: [El comercio]php zend framework (speech)

CakePHP CodeIgniter Symfony Yii ZF

PHP4 SI SI NO NO NO

PHP5 SI SI SI SI SI

Multiple DB SI SI SI SI SI

Validation SI SI SI SI SI

Ajax SI NO SI SI SI

Auth SI NO SI SI SI

Modular SI NO SI SI SI

Fuente: http:///www.phpframeworks.com

Page 32: [El comercio]php zend framework (speech)

PROS CONS • Open Source

• Bajo acoplamiento

• Flexibilidad

• Buena Documentación

• 100% OO

• Uso de Patrones

• Amplia Librería

• Business – friendly – Licencia

– Soporte

• Zend Server

• Certificable

• Menos CoC que otros FWs

• Menos RAD que otros FWs

• Pocos ejemplos, tutoriales

• Mayor curva de aprendizaje

• No hay scaffolding

Page 33: [El comercio]php zend framework (speech)

ANATOMÍA DE UNA APLICACIÓN ZEND

Page 34: [El comercio]php zend framework (speech)

Agenda

Definiciones Comparaciones con otros Frameworks Anatomía de una Aplicación Zend

Estructura de directorios public/index.php application.ini Bootstrap Controllers Views Models

Recomendaciones para lograr Mantenibilidad Recomendaciones para lograr Alta Disponibilidad Recomendaciones de Seguridad

Forms

Layouts

Módulos

View Helpers

Orden de ejecución

Plugins

Action Helpers

Page 35: [El comercio]php zend framework (speech)

Estructura de directorios

Page 36: [El comercio]php zend framework (speech)

Directorio public

DocumentRoot

Page 37: [El comercio]php zend framework (speech)

MVC

Page 38: [El comercio]php zend framework (speech)

Relación entre Controladores y Vistas

Page 39: [El comercio]php zend framework (speech)

<?php

// index.php

// ...

/** Zend_Application */

require_once 'Zend/Application.php';

// Create application, bootstrap, and run

$application = new Zend_Application(

APPLICATION_ENV,

APPLICATION_PATH . '/configs/application.ini'

);

$application->bootstrap()

->run();

?>

public/index.php

Page 40: [El comercio]php zend framework (speech)

application/configs/application.ini

Page 41: [El comercio]php zend framework (speech)

Bootstrap

• La clase Bootstrap define que recursos y componentes que se deben inicializar.

• De forma predeterminada, el Front Controller es inicializado (Zend_Controller_Front), y configura por defecto el directorio “application/controllers/” para manejar los Controladores (Action Controllers).

Page 42: [El comercio]php zend framework (speech)

Bootstrap por defecto

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap

{

}

?>

al crear un proyecto

Page 43: [El comercio]php zend framework (speech)

Bootstrap con métodos _init* <?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap

{

protected function _initFoo()

{

// ...

}

protected function _initBar()

{

// ...

}

protected function _initBaz()

{

// ...

}

}

?>

Page 44: [El comercio]php zend framework (speech)

Ejemplos de métodos de Bootstrap

Page 45: [El comercio]php zend framework (speech)

Ejemplos de métodos de Bootstrap

Page 46: [El comercio]php zend framework (speech)

Controllers

Page 47: [El comercio]php zend framework (speech)

Controlador Zend

<?php

class IndexController extends Zend_Controller_Action

{

public function init()

{

}

public function indexAction()

{

}

public function arraydataAction()

{

$this->view->users = array(

array('nombre'=>'Carlos'),

array('nombre'=>'Pedro'),

array('nombre'=>'Juan'),

array('nombre'=>'José')

);

}

}

Page 48: [El comercio]php zend framework (speech)

A través de $this->view->var = „valor„;

$this->asign(„var„, „valor');

<?php

class IndexController extends Zend_Controller_Action

{

public function seeRequestAction()

{

$this->view->username = ”eanaya”;

}

}

Usuario: <?=$this->username?> <br />

Pasar variables del controlador a la vista

Page 49: [El comercio]php zend framework (speech)

Front Controller • Zend_Controller_Front implementa el patrón Front

Controller usado en aplicaciones MVC .

• También implementa el patrón Singleton

• Su propósito es:

– inicializar el entorno de la solicitud

– rutear la solicitud (Request) entrante

– y luego hacer un envío de cualquier de las acciones descubiertas

– le agrega las respuestas y las regresa cuando se completa el proceso.

http://en.wikipedia.org/wiki/Front_Controller_pattern Ref.

Page 50: [El comercio]php zend framework (speech)
Page 51: [El comercio]php zend framework (speech)

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} -s [OR]

RewriteCond %{REQUEST_FILENAME} -l [OR]

RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^.*$ - [NC,L]

RewriteRule ^.*$ index.php [NC,L]

.htaccess

¿Cómo es posible que capture todas las peticiones?

Page 52: [El comercio]php zend framework (speech)

Views

Page 53: [El comercio]php zend framework (speech)

Vista

<?php

// recibe variables del controlador

echo $this->variable;

?>

Page 54: [El comercio]php zend framework (speech)

<?=$this->variable?>

Es correcto usar short_open_tag=On?

Page 55: [El comercio]php zend framework (speech)

<?=$this->variable?>

Es correcto usar short_open_tag=On?

Page 56: [El comercio]php zend framework (speech)

short_open_tag = On

PROS CONS

• Legibilidad

• Rapidez

• Menos Portabilidad

• Podría llegar a hacer conflictos si es que se configura el servidor web para que mod_php procese archivos xml

<?xml version="1.0" encoding="UTF-8"?>

<feed>…</feed>

<? foreach ($this->categorias as $categoria): ?>

<tr> … … … </tr>

<? endforeach; ?>

Page 57: [El comercio]php zend framework (speech)

Escapar cadenas en la vista <?php

// mala idea

echo $this->variable;

// buena práctica

echo $this->escape($this->variable);

?>

• No ‘escapar’ las vistas puede ocasionar fallos de seguridad como Cross Site Scripting[1].

• Se deben escapar las cadenas que fueron ingresadas por usuarios.

[1] http://es.wikipedia.org/wiki/Cross-site_scripting

<?php foreach ($this->categorias as $categoria): ?>

<tr>

<td><?php echo $this->escape($categoria[„nombre']) ?></td>

<td><?php echo $this->escape($categoria[„descripcion']) ?></td>

</tr>

<?php endforeach; ?>

Page 58: [El comercio]php zend framework (speech)

Models

Page 59: [El comercio]php zend framework (speech)

Models

Page 60: [El comercio]php zend framework (speech)

No existe Zend_Model

No existe una forma específica de implementar modelos

Page 61: [El comercio]php zend framework (speech)

Qué hacen los modelos?

• Persistencia de datos • Obtener • Guardar • Modificar • Borrar

Page 62: [El comercio]php zend framework (speech)

Cómo?

• Bases de datos • Web Services • Feeds • Archivos • Enumeraciones • Etc.

Page 63: [El comercio]php zend framework (speech)

Cómo?

• Bases de datos • Web Services • Feeds • Archivos • Enumeraciones • Etc.

Escenario Común

Page 64: [El comercio]php zend framework (speech)

Zend_Db

• Zend_Db_Adapter

• Zend_Db_Statement

• Zend_Db_Profiler

• Zend_Db_Select

• Zend_Db_Table

• Zend_Db_Table_Row

• Zend_Db_Table_Rowset

• Zend_Db_Table Relationships

• Zend_Db_Table_Definition

Page 65: [El comercio]php zend framework (speech)

Zend_Db_Adapter

resources.db.adapter = 'pdo_mysql'

resources.db.isDefaultAdapter = true

resources.db.params.host = '192.168.1.88'

resources.db.params.dbname = 'czpls_devel'

resources.db.params.username = 'czpls_devel'

resources.db.params.password = 'm83o823nkdnakh'

resources.db.params.charset = 'utf-8'

resources.db.params.profiler.enabled = true

resources.db.params.profiler.class = 'Zend_Db_Profiler_Firebug'

Configuracion en application.ini

Page 66: [El comercio]php zend framework (speech)

Zend_Db_Table

Page 67: [El comercio]php zend framework (speech)

Zend_Db_Select public function listar() {

$db = $this->getAdapter();

$filas = $db->select()

->from($this->_name)

->join(

'categoria',

'producto.id_categoria=categoria.id',

array('categoria'=>'nombre')

)

->join(

'fabricante',

'producto.id_fabricante=fabricante.id',

array('fabricante'=>'nombre')

)

->query();

return $filas;

}

Page 68: [El comercio]php zend framework (speech)

Zend_Db_Select $filas = $db->select()

->from(

$this->_name,

array('id_producto'=>'id',

'producto'=>'nombre', 'precio')

)

->joinLeft(

'categoria',

'producto.id_categoria=categoria.id',

array('categoria' => 'nombre‟)

)

->joinLeft(

'fabricante',

'producto.id_fabricante=fabricante.id',

array('fabricante' => 'nombre„)

)->query();

Page 69: [El comercio]php zend framework (speech)

Forms

Page 70: [El comercio]php zend framework (speech)

Zend_Form simplifica la creación y manejo de formularios en nuestra aplicación web. Realiza las siguientes tareas:

• Agregar, eliminar, modificar Elementos

• Filtrar y Validar Elementos

• Ordenamiento de Elementos

• Renderizado de Elementos y Formularios, incluyendo escape

• Agrupamientos de Elementos

• Configuración a nivel de Formulario y Elemento configuration

Page 71: [El comercio]php zend framework (speech)

Layout

Page 72: [El comercio]php zend framework (speech)

Configurar el LayoutPath

Page 73: [El comercio]php zend framework (speech)
Page 74: [El comercio]php zend framework (speech)

Módulos

Page 75: [El comercio]php zend framework (speech)

Misma estructura de una app Dentro de cada Modulo.

Page 76: [El comercio]php zend framework (speech)

Podemos setear configs de módulo application.ini

Page 77: [El comercio]php zend framework (speech)

View Helpers

Page 78: [El comercio]php zend framework (speech)

View Helpers

• En los templates es frecuente hacer acciones varias veces: • Formatear fechas • Bloques • Widgets • Etc.

• Pincipio de funcionamiento: “Desacoplar la data de la presentación”

Page 79: [El comercio]php zend framework (speech)

View Helpers

• En los templates es frecuente hacer acciones varias veces: • Formatear fechas • Bloques • Widgets • Etc.

• Pincipio de funcionamiento: “Desacoplar la data de la presentación” • Zend viene con algunos View Helpers • Tambien podemos construir los nuestros

Page 80: [El comercio]php zend framework (speech)

Zend_View_Helper_*

• url(); • partial() • partialLoop(); • placeHolder(); • doctype(); • headTitle(); • headMeta(); • headLink(); • headStyle(); • headScript(); • Etc…

Page 81: [El comercio]php zend framework (speech)

Nuestros propios View Helpers

Page 82: [El comercio]php zend framework (speech)
Page 83: [El comercio]php zend framework (speech)

View Helpers de Módulo

View Helpers de Aplicación

Registrar View Helpers de Aplicación en Bootstrap

Page 84: [El comercio]php zend framework (speech)

En que orden ocurren las cosas detrás de Zend?

Page 85: [El comercio]php zend framework (speech)
Page 86: [El comercio]php zend framework (speech)

Plugins

Page 87: [El comercio]php zend framework (speech)

class My_Controller_Plugin_Routes extends Zend_Controller_Plugin_Abstract

{

public function routeStartup(Zend_Controller_Request_Abstract $request) {

$routes = array(

'login' => new Zend_Controller_Router_Route(

'login',

array(

'controller' => 'test',

'action' => 'login'

)

),

'logout' => new Zend_Controller_Router_Route(

'logout',

array(

'controller' => 'index',

'action' => 'logout'

)

)

);

$router = Zend_Controller_Front::getInstance()->getRouter();

$router->addRoutes($routes);

parent::routeStartup($request);

}

}

Ejemplos Plugins: Router

Page 88: [El comercio]php zend framework (speech)

Ejemplos Plugins: ACL

class My_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract

{

public function preDispatch(Zend_Controller_Request_Abstract $request) {

$acl = new Zend_Acl();

$acl->addRole('admin');

$acl->addRole('ventas');

$acl->addRole('supervisor_ventas','ventas');

$acl->addRole('logistica');

$acl->addResource('productos');

$acl->addResource('categorias');

$acl->addResource('fabricantes');

$acl->addResource('reportes');

$acl->allow('ventas','productos','vender');

$acl->allow('logistica','reportes','ultimos10');

$acl->allow('supervisor_ventas','reportes','ultimos10');

$acl->allow('admin');

// guardamos la ACL en sesión

$regAcl = Zend_Registry::get('acl');

$regAcl->acl = $acl;

parent::preDispatch($request);

}

}

Page 89: [El comercio]php zend framework (speech)

Registramos los plugins en el bootstrap

protected function _initPlugins()

{

Zend_Controller_Front::getInstance()->registerPlugin(

new My_Controller_Plugin_Acl()

);

Zend_Controller_Front::getInstance()->registerPlugin(

new My_Controller_Plugin_Routes()

);

}

Page 90: [El comercio]php zend framework (speech)

Action Helpers

Page 91: [El comercio]php zend framework (speech)

Action Helpers

• Permite a los desarrolladores injectar funcionalidad ya sea en tiempo de ejecución o a demanda a los controladores.

Page 92: [El comercio]php zend framework (speech)

Ejemplo Action Helper class My_Controller_Action_Helper_Auth

extends Zend_Controller_Action_Helper_Abstract {

protected $view;

public function preDispatch() {

$view = $this->getView();

$controller = $this->getActionController();

if(Zend_Auth::getInstance()->hasIdentity()){

$view->isAuth = $controller->isAuth = true;

$authData = Zend_Auth::getInstance()->getStorage()->read();

$view->auth = $controller->auth = $authData;

}else{

$view->isAuth = $controller->isAuth = false;

}

parent::preDispatch();

}

private function getView() {

if($this->view !== null){

return $this->view;

}

$controller = $this->getActionController();

$this->view = $controller->view;

return $this->view;

}

}

Page 93: [El comercio]php zend framework (speech)

Registrando los Action Helpers en el bootstrap

;Application.ini resources.frontController.actionhelperpaths.App_Controller_Action_Helper =

"App/Controller/Action/Helper"

// bootstrap

protected function _initActionHelpers()

{

Zend_Controller_Action_HelperBroker::addHelper(

new My_Controller_Action_Helper_Auth()

);

Zend_Controller_Action_HelperBroker::addHelper(

new My_Controller_Action_Helper_MyFlashMessenger()

);

}

Page 94: [El comercio]php zend framework (speech)

Ejemplo Action Helper

class My_Controller_Action_Helper_Rand

extends Zend_Controller_Action_Helper_Abstract

{

public function getRand($max)

{

return rand(1, $max);

}

public function direct($max)

{

return $this->getRand($max);

}

}

Page 95: [El comercio]php zend framework (speech)

Usando los Action Helpers

public function actionHelpersAction() {

if ($this->isAuth) {

$this->log->debug($this->auth);

}

$randHelper = $this->getHelper('Rand');

$this->view->rand1 = $randHelper->getRand(100);

$randHelper = $this->_helper->getHelper('Rand');

$this->view->rand2 = $randHelper->getRand(100);

$randHelper = $this->_helper->Rand;

$this->view->rand3 = $randHelper->getRand(100);

$this->view->rand4 = $this->_helper->Rand(100);

}

Page 96: [El comercio]php zend framework (speech)

MANTENIBILIDAD

Page 97: [El comercio]php zend framework (speech)

Agenda

Definiciones Comparaciones con otros Frameworks Anatomía de una Aplicación Zend Recomendaciones para lograr Mantenibilidad

Parametrización DRY

View Helpers Action Helpers

Coding Standards: PHP_CodeSniffer Object Calisthenics PHP

Manejo de Errores con Zend Uso de Logs

Grupo de discusión: php-standards Recomendaciones para lograr Alta Disponibilidad Recomendaciones de Seguridad PHP

Page 98: [El comercio]php zend framework (speech)

Parametrización

• El objetivo es evitar futuros cambios de código en la aplicación

; ADECSYS

adecsys.wsdl = "http://dev.wsadecsys.info/AppService.asmx?wsdl"

; Parametros Globales reales DPCH

adecsys.proxy.enabled = 1 adecsys.proxy.param.proxy_host = '192.168.1.5'

adecsys.proxy.param.proxy_port = '8123'

adecsys.proxy.param.proxy_login = 'user'

adecsys.proxy.param.proxy_password = 'pass'

Page 99: [El comercio]php zend framework (speech)

Parametrización

apis.facebook.appid = “jm97239j872398"

apis.facebook.appsecret = “0r09340980j95f834095jf3098d039486j403gj"

app.siteUrl = "http://devel.myzfapp.info"

app.adminUrl = "http://devel.myzfapp.info"

app.mediaUrl = "http://devel.myzfapp.info/static"

app.elementsUrlImg = "http://devel.myzfapp.info/elements/aptitus/cvs/"

app.elementsUrlCvs = "http://devel.myzfapp.info/elements/aptitus/cvs/"

app.elementsUrlLogos = "http://devel.myzfapp.info/elements/aptitus/logos/"

app.elementsUrlNotas = "http://devel.myzfapp.info/elements/aptitus/notas/

Page 100: [El comercio]php zend framework (speech)

Parametrización [subjects]

nuevoUsuario = '{%subjectMessage%} a Aptitus.pe, {%nombre%}„

nuevoAdm = 'Bienvenido a Aptitus.pe'

nuevaEmpresa = '{%empresa%} registro de empresa en Aptitus.pe'

postularAviso = '{%nombre%}, postulaste al aviso de {%nombrePuesto%} en Aptitus.pe'

confirmarCompra = '{%nombre%}, compraste un aviso en Aptitus.pe'

confirmarVoucherPagoEfectivo = '{%nombre%}, registraste un aviso en Aptitus.pe„

avisoPublicado = 'Su aviso de {%nombrePuesto%} se publicó en Aptitus.pe'

avisoRegistrado = 'Su aviso de {%nombrePuesto%} está pendiente de Publicación'

recuperarContrasenaPostulante = '{%nombre%}, cambia tu contraseña en Aptitus'

recuperarContrasenaEmpresa = 'Cambio de contraseña en Aptitus'

recuperarContrasenaAdministrador = '{%nombre%}, cambia tu contraseña en Aptitus'

invitarPostular = '{%nombre%}, tienes una invitacion en Aptitus.pe'

mensajePostulante = '{%nombre%},tienes un mensaje de la empresa {%empresa%} en Apt.'

Page 101: [El comercio]php zend framework (speech)

DRY

Don’t Repeat Yourself

Page 102: [El comercio]php zend framework (speech)

Don’t Repeat Yourself

Aprovechar Helpers

Page 103: [El comercio]php zend framework (speech)

Coding Standards

DEMO: PHP_CodeSniffer

Page 105: [El comercio]php zend framework (speech)

Motivación

• Código

– Legible

– Comprensible

– Testeable

– Mantenible

Page 106: [El comercio]php zend framework (speech)

Reglas Simples

Page 107: [El comercio]php zend framework (speech)

Regla:

Solo un nivel de Indentación por método

Page 108: [El comercio]php zend framework (speech)

Solo un nivel de Indentación por método

Page 109: [El comercio]php zend framework (speech)

Solo un nivel de Indentación por método

Page 110: [El comercio]php zend framework (speech)

Solo un nivel de Indentación por método

Page 111: [El comercio]php zend framework (speech)

Solo un nivel de Indentación por método

Page 112: [El comercio]php zend framework (speech)

Solo un nivel de Indentación por método

Page 113: [El comercio]php zend framework (speech)

Solo un nivel de Indentación por método

Page 114: [El comercio]php zend framework (speech)

Solo un nivel de Indentación por método

Page 115: [El comercio]php zend framework (speech)

Solo un nivel de Indentación por método

Page 116: [El comercio]php zend framework (speech)

Solo un nivel de Indentación por método

Page 117: [El comercio]php zend framework (speech)

Regla:

No usar else

Page 118: [El comercio]php zend framework (speech)

No usar else

Page 119: [El comercio]php zend framework (speech)

No usar else

Page 120: [El comercio]php zend framework (speech)

No usar else

Page 121: [El comercio]php zend framework (speech)

No usar else

Page 122: [El comercio]php zend framework (speech)

Regla:

Solo una flecha por línea

Page 123: [El comercio]php zend framework (speech)

Solo una flecha por línea

Zend_Auth::getInstance()->getStorage()->read()->write();

• Incrementa la dificultad de encontrar un error.

Page 124: [El comercio]php zend framework (speech)

Solo una flecha por línea

• Usando Interfaz fluida

Page 125: [El comercio]php zend framework (speech)

Solo una flecha por línea

• En varias lineas a no ser que sean setters o getters

$user->getLocationPoint()->getCountry()->getName();

Page 126: [El comercio]php zend framework (speech)

Regla:

Mantener las clases pequeñas

• Max. 100 líneas por Clase • Max 15 Clases por Paquete

Page 127: [El comercio]php zend framework (speech)

Regla:

Documenta tu código

Page 128: [El comercio]php zend framework (speech)

Documenta tu código

Page 129: [El comercio]php zend framework (speech)

Documenta tu código

Page 130: [El comercio]php zend framework (speech)

Grupo de Discusión: php-standards

http://groups.google.com/group/php-standards Link

Page 131: [El comercio]php zend framework (speech)

ALTA DISPONIBILIDAD

Page 132: [El comercio]php zend framework (speech)

Agenda

Definiciones

Comparaciones con otros Frameworks

Anatomía de una Aplicación Zend

Recomendaciones para lograr Mantenibilidad

Recomendaciones para lograr Alta Disponibilidad

Performance

Base de datos

Indices

Desnormalizar

Correcto uso de Zend_Paginator

Cache

Adaptadores

Cache Metadata

Escalabilidad

Zend_Sesion_SaveHandler_ DbTable

No hardcodear links

Recomendaciones de Seguridad

PHP

Page 133: [El comercio]php zend framework (speech)

• Performance • Base de Datos

• Indices

Page 134: [El comercio]php zend framework (speech)

• Performance • Base de Datos

• Indices

SELECT * FROM empresa WHERE ruc=$ruc

Page 135: [El comercio]php zend framework (speech)

• Performance • Base de Datos

• Desnormalizar

Page 136: [El comercio]php zend framework (speech)

• Performance • Zend_Paginator

• Uso Incorrecto

Page 137: [El comercio]php zend framework (speech)

• Performance • Zend_Paginator

• Uso Correcto

Page 138: [El comercio]php zend framework (speech)

• Performance • Zend_Cache

• El dilema

• Alta Disponibilidad VS. Consistencia

Page 139: [El comercio]php zend framework (speech)

• Performance • Zend_Cache

• Uso

Page 140: [El comercio]php zend framework (speech)

• Performance • Zend_Cache

• Adaptadores

Page 141: [El comercio]php zend framework (speech)

• Performance • Zend_Cache

• Cache Metadata

Metadata

Page 142: [El comercio]php zend framework (speech)

• Performance • Zend_Cache

• Cache Metadata

resources.db.adapter = 'pdo_mysql'

resources.db.isDefaultAdapter = true

resources.db.params.host = '192.168.1.88'

resources.db.params.dbname = 'czpls_devel'

resources.db.params.username = 'czpls_devel'

resources.db.params.password = 'm83o823nkdnakh'

resources.db.params.charset = 'utf-8'

resources.db.params.profiler.enabled = true

resources.db.params.profiler.class = 'Zend_Db_Profiler_Firebug'

resources.db.params.defaultMetadataCache = 'file'

Page 143: [El comercio]php zend framework (speech)

• Escalabilidad

Habilidad para poder incrementar la carga de trabajo sin que esto afecte la calidad del servicio.

Page 144: [El comercio]php zend framework (speech)

• Escalabilidad

“Languages, libraries and frameworks don't scale. Architectures do”

Page 145: [El comercio]php zend framework (speech)

• Escalabilidad

Si la aplicación va a ser desplegada en un ambiente distribuido, se deben de tomar algunas consideraciones

iNET LB

App1

App2

AppN

DB

Otros Serv.

Page 146: [El comercio]php zend framework (speech)

• Escalabilidad • Carga distribuida

• Zend_Sesion_SaveHandler_DbTable

resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable“

resources.session.saveHandler.options.name = "zend_session“

resources.session.saveHandler.options.primary = "id“

resources.session.saveHandler.options.modifiedColumn = "modified“

resources.session.saveHandler.options.dataColumn = "data“

resources.session.saveHandler.options.lifetimeColumn = "lifetime"

Almacenar las sesiones en un punto central

Page 147: [El comercio]php zend framework (speech)

• Escalabilidad • Carga distribuida

• Evitar Links Duros

<a href="http://myapp.info/usuario/agregar">Agregar</a>

<img src="http://myapp.info/images/tile.png" />

<? $url=$this->url(array('controller'=>'usuario','action'=>'agregar'))?>

<a href="<?=$url?>">Agregar</a>

<img src="<?=MEDIA_URL?>/images/tile.png" />

Page 148: [El comercio]php zend framework (speech)

SEGURIDAD

Page 149: [El comercio]php zend framework (speech)

Agenda

Definiciones

Comparaciones con otros Frameworks

Anatomía de una Aplicación Zend

Recomendaciones para lograr Mantenibilidad

Recomendaciones para lograr Alta Disponibilidad

Recomendaciones de Seguridad

Top OWASP 2010

Sql Injection

Cross Site Scripting

Cross-site Request Forgery

Page 150: [El comercio]php zend framework (speech)

DEMO

Page 151: [El comercio]php zend framework (speech)

GRACIAS