[El comercio]php zend framework (speech)

3,011 views

Published on

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

Published in: Technology
2 Comments
3 Likes
Statistics
Notes
No Downloads
Views
Total views
3,011
On SlideShare
0
From Embeds
0
Number of Embeds
122
Actions
Shares
0
Downloads
187
Comments
2
Likes
3
Embeds 0
No embeds

No notes for slide

[El comercio]php zend framework (speech)

  1. 1. Introducción a PHP Zend Framework Ernesto Anaya Ruiz ernesto.anaya@ec.pe
  2. 2. AGENDA
  3. 3. 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
  4. 4. DEFINICIONES
  5. 5. 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
  6. 6. ¿Qué es un Framework?
  7. 7. ¿Qué es un Framework?
  8. 8. ¿Qué es un Framework?• Herramientas• Conceptos• Prácticas• Criterios Enfocados en resolver ciertos tipos de problemas
  9. 9. 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.
  10. 10. Problemas comunes• Persistencia de Datos • WebServices• Validación de • Manejo de Sesión Formularios • ACL• Autenticación • Configuración• E-mailing• Seguridad • Manejo de Excepciones• Routing• Cache • Búsquedas• Log • Paginado • Etc…
  11. 11. No Reinventemos la rueda
  12. 12. • 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
  13. 13. Componentes de ZF• MVC • Zend_Controller – Front Controller• Database – Router• I18N – Dispatcher – Action Controller• Auth y ACL – Plugins y Helpers• Web Services – Request y Response • Zend_View• Mail, Formats, Search – PHP-based views• Utilitarios – Helpers • Zend_Layout • Zend_Form
  14. 14. Componentes de ZF• MVC • Zend_Db_Adapter• Database – Adaptadores para la mayoría de extensiones• I18N de PHP• Auth y ACL • Zend_Db_Profiler• Web Services • Zend_Db_Select• Mail, Formats, Search • Zend_Db_Table• Utilitarios – Zend_Db_Table_Rowset – Zend_Db_Table_Row
  15. 15. Componentes de ZF• MVC • Zend_Locale• Database • Zend_Date • Zend_Measure• I18N • Zend_Currency• Auth y ACL • Zend_Translate• Web Services – Adaptadores • PHP Arrays• Mail, Formats, Search • CVS• Utilitarios • Gettext • Qt • Tmx • Xliff
  16. 16. Componentes de ZF• MVC • Zend_Auth – Zend_Db_Table Adapter• Database – HTTP Digest• I18N – Ldap – Escribe tu propio• Auth y ACL adaptador• Web Services • Zend_Sesion – Zend_Sesion_Storage• Mail, Formats, Search • Zend_Acl• Utilitarios – Roles – Resources – Rights (Privilegios)
  17. 17. Componentes de ZF• MVC • Zend_Http_Client • Zend_Rest_Client• Database • Zend_Services – Amazon ,Delicious, Ebay, Flickr,• I18N ReCaptcha, ShortUrl, Technorati, Twitter,• Auth y ACL WindowsAzure, Yahoo, etc. • Zend_Feed• Web Services – Rss y Atom• Mail, Formats, Search • Zend_Gdata – Books, Docs, Calendar, Picasa,• Utilitarios Youtube • Zend_Soap • Zend_Json_Server • Zend_XmlRpc
  18. 18. Componentes de ZF• MVC • Zend_Mail• Database • Zend_Mime• I18N • Zend_Pdf• Auth y ACL • Zend_Search_Lucene• Web Services – Compatibilidad con Apache Lucene• Mail, Formats, Search• Utilitarios
  19. 19. Componentes de ZF• MVC • Zend_Cache• Database • Zend_Config• I18N • Zend_Console_Getopt• Auth y ACL • Zend_Filter• Web Services • Zend_Loader• Mail, Formats, Search • Zend_Log• Utilitarios • Zend_Registry • Zend_Validate
  20. 20. Componentes de ZF• MVC• Database• I18N• Auth y ACL Y mucho más• Web Services• Mail, Formats, Search• Utilitarios
  21. 21. Sepamos diferenciar:• Frameworks • Full Stack • Microframeworks• Component Library• Content Management System
  22. 22. Ejemplos• 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
  23. 23. 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
  24. 24. Proceso de Calidad ZF1. Cuéntanos que es lo que propones 1. Redactar el Proposal Document2. 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 funciona3. 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
  25. 25. Usos de ZF• Como Full Stack web framework – Aplicaciones web• Como Component Library – Cron Jobs • cron_importar_adecsys.php • cron_despublicar_avisos.php – Tools • zf.php • sync.php • test_ws.php • scrapersLectura Recomendada:http://www.slideshare.net/shahar/zend-framework-components-for-nonframework-useShahar Evron 2008 – colaborador de ZF
  26. 26. Patrón MVC
  27. 27. COMPARACIONES CON OTROS FRAMEWORKS
  28. 28. 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
  29. 29. CakePHP CodeIgniter Symfony Yii ZFLicencia MIT OSL MIT New BSD BSDInicio 2005-08 2006-01 2005-10 2008-01 2006-03PHP 5.2+ 5.1+ 5 5.1+ 5.2.4+MVC Si Si Si Si SiI18n Si Incompleto Si Si SiORM Active Record Third Party Only Doctrine, Propel DAO, Zend_Db Data Maper Active RecordTesting Si Next Release Si Si SiSeguridad ACL Si Plugin ACL, RBAC. ACL PluginsTemplates Si Si Si Si SiCaché Si Si Si Si SiScaffolding Si No Si Si No Fuente: http://en.wikipedia.org/wiki/Comparison_of_web_application_frameworks
  30. 30. CakePHP CodeIgniter Symfony Yii ZFPHP4 SI SI NO NO NOPHP5 SI SI SI SI SIMultiple DB SI SI SI SI SIValidation SI SI SI SI SIAjax SI NO SI SI SIAuth SI NO SI SI SIModular SI NO SI SI SI Fuente: http:///www.phpframeworks.com
  31. 31. PROS CONS• Open Source • Menos CoC que otros FWs• Bajo acoplamiento • Menos RAD que otros FWs• Flexibilidad • Pocos ejemplos, tutoriales• Buena Documentación • Mayor curva de aprendizaje• 100% OO • No hay scaffolding• Uso de Patrones• Amplia Librería• Business – friendly – Licencia – Soporte• Zend Server• Certificable
  32. 32. ANATOMÍA DE UNA APLICACIÓN ZEND
  33. 33. Agenda Definiciones Comparaciones con otros Frameworks Anatomía de una Aplicación Zend  Estructura de directorios  Forms  public/index.php  Layouts  application.ini  Módulos  Bootstrap  View Helpers  Controllers  Orden de ejecución  Views  Plugins  Models  Action Helpers Recomendaciones para lograr Mantenibilidad Recomendaciones para lograr Alta Disponibilidad Recomendaciones de Seguridad
  34. 34. Estructura de directorios
  35. 35. Directorio publicDocumentRoot
  36. 36. MVC
  37. 37. Relación entre Controladores y Vistas
  38. 38. public/index.php<?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();?>
  39. 39. application/configs/application.ini
  40. 40. 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).
  41. 41. Bootstrap por defecto al crear un proyecto<?phpclass Bootstrap extends Zend_Application_Bootstrap_Bootstrap{}?>
  42. 42. Bootstrap con métodos _init*<?phpclass Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ protected function _initFoo() { // ... } protected function _initBar() { // ... } protected function _initBaz() { // ... }}?>
  43. 43. Ejemplos de métodos de Bootstrap
  44. 44. Ejemplos de métodos de Bootstrap
  45. 45. Controllers
  46. 46. Controlador Zend<?phpclass 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é) ); }}
  47. 47. Pasar variables del controlador a la vista A través de $this->view->var = „valor„; $this->asign(„var„, „valor);<?phpclass IndexController extends Zend_Controller_Action{ public function seeRequestAction() { $this->view->username = ”eanaya”; }}Usuario: <?=$this->username?> <br />
  48. 48. 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. Ref. http://en.wikipedia.org/wiki/Front_Controller_pattern
  49. 49. ¿Cómo es posible que capture todas las peticiones? .htaccessRewriteEngine OnRewriteCond %{REQUEST_FILENAME} -s [OR]RewriteCond %{REQUEST_FILENAME} -l [OR]RewriteCond %{REQUEST_FILENAME} -dRewriteRule ^.*$ - [NC,L]RewriteRule ^.*$ index.php [NC,L]
  50. 50. Views
  51. 51. Vista<?php // recibe variables del controlador echo $this->variable;?>
  52. 52. Es correcto usar short_open_tag=On? <?=$this->variable?>
  53. 53. Es correcto usar short_open_tag=On? <?=$this->variable?>
  54. 54. short_open_tag = On PROS CONS • Legibilidad • Menos Portabilidad • Rapidez • Podría llegar a hacer conflictos si es que se configura el servidor web para que mod_php procese archivos xml<? foreach ($this->categorias as $categoria): ?> <tr> … … … </tr><? endforeach; ?> <?xml version="1.0" encoding="UTF-8"?> <feed>…</feed>
  55. 55. 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. <?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; ?>[1] http://es.wikipedia.org/wiki/Cross-site_scripting
  56. 56. Models
  57. 57. Models
  58. 58. No existe Zend_ModelNo existe una forma específica de implementar modelos
  59. 59. Qué hacen los modelos?• Persistencia de datos • Obtener • Guardar • Modificar • Borrar
  60. 60. Cómo?• Bases de datos• Web Services• Feeds• Archivos• Enumeraciones• Etc.
  61. 61. Cómo?• Bases de datos Escenario Común• Web Services• Feeds• Archivos• Enumeraciones• Etc.
  62. 62. 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
  63. 63. Zend_Db_Adapter Configuracion en application.iniresources.db.adapter = pdo_mysqlresources.db.isDefaultAdapter = trueresources.db.params.host = 192.168.1.88resources.db.params.dbname = czpls_develresources.db.params.username = czpls_develresources.db.params.password = m83o823nkdnakhresources.db.params.charset = utf-8resources.db.params.profiler.enabled = trueresources.db.params.profiler.class = Zend_Db_Profiler_Firebug
  64. 64. Zend_Db_Table
  65. 65. Zend_Db_Selectpublic 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;}
  66. 66. 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();
  67. 67. Forms
  68. 68. Zend_Form simplifica la creación y manejo de formularios ennuestra 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
  69. 69. Layout
  70. 70. Configurar el LayoutPath
  71. 71. Módulos
  72. 72. Misma estructura de una app Dentro de cada Modulo.
  73. 73. Podemos setear configs de módulo application.ini
  74. 74. View Helpers
  75. 75. 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”
  76. 76. 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
  77. 77. Zend_View_Helper_* • url(); • partial() • partialLoop(); • placeHolder(); • doctype(); • headTitle(); • headMeta(); • headLink(); • headStyle(); • headScript(); • Etc…
  78. 78. Nuestros propios View Helpers
  79. 79. View Helpers de Módulo View Helpers de AplicaciónRegistrar View Helpers de Aplicación en Bootstrap
  80. 80. En que orden ocurren las cosas detrás de Zend?
  81. 81. Plugins
  82. 82. Ejemplos Plugins: Routerclass 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); }}
  83. 83. Ejemplos Plugins: ACLclass 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); }}
  84. 84. Registramos los plugins en el bootstrapprotected function _initPlugins(){ Zend_Controller_Front::getInstance()->registerPlugin( new My_Controller_Plugin_Acl() ); Zend_Controller_Front::getInstance()->registerPlugin( new My_Controller_Plugin_Routes() );}
  85. 85. Action Helpers
  86. 86. Action Helpers• Permite a los desarrolladores injectar funcionalidad ya sea en tiempo de ejecución o a demanda a los controladores.
  87. 87. Ejemplo Action Helperclass My_Controller_Action_Helper_Authextends 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; }}
  88. 88. Registrando los Action Helpers en el bootstrap// bootstrapprotected function _initActionHelpers(){ Zend_Controller_Action_HelperBroker::addHelper( new My_Controller_Action_Helper_Auth() ); Zend_Controller_Action_HelperBroker::addHelper( new My_Controller_Action_Helper_MyFlashMessenger() );};Application.iniresources.frontController.actionhelperpaths.App_Controller_Action_Helper = "App/Controller/Action/Helper"
  89. 89. Ejemplo Action Helperclass My_Controller_Action_Helper_Randextends Zend_Controller_Action_Helper_Abstract{ public function getRand($max) { return rand(1, $max); } public function direct($max) { return $this->getRand($max); }}
  90. 90. Usando los Action Helperspublic 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);}
  91. 91. MANTENIBILIDAD
  92. 92. 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
  93. 93. Parametrización • El objetivo es evitar futuros cambios de código en la aplicación; ADECSYSadecsys.wsdl = "http://dev.wsadecsys.info/AppService.asmx?wsdl"; Parametros Globales reales DPCHadecsys.proxy.enabled = 1 adecsys.proxy.param.proxy_host = 192.168.1.5adecsys.proxy.param.proxy_port = 8123adecsys.proxy.param.proxy_login = useradecsys.proxy.param.proxy_password = pass
  94. 94. Parametrizaciónapis.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/
  95. 95. Parametrización[subjects]nuevoUsuario = {%subjectMessage%} a Aptitus.pe, {%nombre%}„nuevoAdm = Bienvenido a Aptitus.penuevaEmpresa = {%empresa%} registro de empresa en Aptitus.pepostularAviso = {%nombre%}, postulaste al aviso de {%nombrePuesto%} en Aptitus.peconfirmarCompra = {%nombre%}, compraste un aviso en Aptitus.peconfirmarVoucherPagoEfectivo = {%nombre%}, registraste un aviso en Aptitus.pe„avisoPublicado = Su aviso de {%nombrePuesto%} se publicó en Aptitus.peavisoRegistrado = Su aviso de {%nombrePuesto%} está pendiente de PublicaciónrecuperarContrasenaPostulante = {%nombre%}, cambia tu contraseña en AptitusrecuperarContrasenaEmpresa = Cambio de contraseña en AptitusrecuperarContrasenaAdministrador = {%nombre%}, cambia tu contraseña en AptitusinvitarPostular = {%nombre%}, tienes una invitacion en Aptitus.pemensajePostulante = {%nombre%},tienes un mensaje de la empresa {%empresa%} en Apt.
  96. 96. DRYDon’t Repeat Yourself
  97. 97. Don’t Repeat YourselfAprovechar Helpers
  98. 98. Coding StandardsDEMO: PHP_CodeSniffer
  99. 99. Coding StandardsLink: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php
  100. 100. Motivación• Código – Legible – Comprensible – Testeable – Mantenible
  101. 101. Reglas Simples
  102. 102. Regla:Solo un nivel de Indentación por método
  103. 103. Solo un nivel de Indentación por método
  104. 104. Solo un nivel de Indentación por método
  105. 105. Solo un nivel de Indentación por método
  106. 106. Solo un nivel de Indentación por método
  107. 107. Solo un nivel de Indentación por método
  108. 108. Solo un nivel de Indentación por método
  109. 109. Solo un nivel de Indentación por método
  110. 110. Solo un nivel de Indentación por método
  111. 111. Solo un nivel de Indentación por método
  112. 112. Regla: No usar else
  113. 113. No usar else
  114. 114. No usar else
  115. 115. No usar else
  116. 116. No usar else
  117. 117. Regla: Solo una flecha por línea
  118. 118. Solo una flecha por líneaZend_Auth::getInstance()->getStorage()->read()->write(); • Incrementa la dificultad de encontrar un error.
  119. 119. Solo una flecha por línea • Usando Interfaz fluida
  120. 120. Solo una flecha por línea$user->getLocationPoint()->getCountry()->getName(); • En varias lineas a no ser que sean setters o getters
  121. 121. Regla: Mantener las clases pequeñas• Max. 100 líneas por Clase• Max 15 Clases por Paquete
  122. 122. Regla: Documenta tu código
  123. 123. Documenta tu código
  124. 124. Documenta tu código
  125. 125. Grupo de Discusión: php-standards Link http://groups.google.com/group/php-standards
  126. 126. ALTA DISPONIBILIDAD
  127. 127. 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
  128. 128. • Performance • Base de Datos • Indices
  129. 129. • Performance • Base de Datos • Indices SELECT * FROM empresa WHERE ruc=$ruc
  130. 130. • Performance • Base de Datos • Desnormalizar
  131. 131. • Performance • Zend_Paginator • Uso Incorrecto
  132. 132. • Performance • Zend_Paginator • Uso Correcto
  133. 133. • Performance • Zend_Cache • El dilema• Alta Disponibilidad VS. Consistencia
  134. 134. • Performance • Zend_Cache • Uso
  135. 135. • Performance • Zend_Cache • Adaptadores
  136. 136. • Performance • Zend_Cache • Cache Metadata Metadata
  137. 137. • Performance • Zend_Cache • Cache Metadataresources.db.adapter = pdo_mysqlresources.db.isDefaultAdapter = trueresources.db.params.host = 192.168.1.88resources.db.params.dbname = czpls_develresources.db.params.username = czpls_develresources.db.params.password = m83o823nkdnakhresources.db.params.charset = utf-8resources.db.params.profiler.enabled = trueresources.db.params.profiler.class = Zend_Db_Profiler_Firebugresources.db.params.defaultMetadataCache = file
  138. 138. • Escalabilidad Habilidad para poder incrementar la carga de trabajo sin que esto afecte la calidad del servicio.
  139. 139. • Escalabilidad “Languages, libraries and frameworks dont scale. Architectures do”
  140. 140. • Escalabilidad Si la aplicación va a ser desplegada en un ambiente distribuido, se deben de tomar algunas consideraciones App1 DB App2 iNET LB … Otros Serv. AppN
  141. 141. • Escalabilidad • Carga distribuida • Zend_Sesion_SaveHandler_DbTableresources.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
  142. 142. • 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" />
  143. 143. SEGURIDAD
  144. 144. 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
  145. 145. DEMO
  146. 146. GRACIAS

×