Introducción a PHP Zend Framework                        Ernesto Anaya Ruiz                         ernesto.anaya@ec.pe
AGENDA
Agenda Definiciones Comparaciones con otros Frameworks Anatomía de una Aplicación Zend Recomendaciones para lograr Man...
DEFINICIONES
Agenda Definiciones   • Framework       • ¿Qué es un Framework?       • Problemas comunes que resuelven los Frameworks   ...
¿Qué es un Framework?
¿Qué es un Framework?
¿Qué es un Framework?•   Herramientas•   Conceptos•   Prácticas•   Criterios    Enfocados en resolver ciertos tipos de pro...
Framework• Un conjunto estandarizado de conceptos, prácticas y criterios  para enfocar un tipo de problemática particular,...
Problemas comunes• Persistencia de Datos   • WebServices• Validación de           • Manejo de Sesión  Formularios         ...
No Reinventemos la rueda
• Zend Framework es un framework de código abierto para  desarrollar aplicaciones web, servicios web, scripts con PHP5.• Z...
Componentes de ZF•   MVC                     • Zend_Controller                               –   Front Controller•   Datab...
Componentes de ZF•   MVC                     • Zend_Db_Adapter•   Database                  – Adaptadores para la         ...
Componentes de ZF•   MVC                     •   Zend_Locale•   Database                •   Zend_Date                     ...
Componentes de ZF•   MVC                     • Zend_Auth                              –   Zend_Db_Table Adapter•   Databas...
Componentes de ZF•   MVC                     • Zend_Http_Client                            • Zend_Rest_Client•   Database ...
Componentes de ZF•   MVC                     •   Zend_Mail•   Database                •   Zend_Mime•   I18N               ...
Componentes de ZF•   MVC                     •   Zend_Cache•   Database                •   Zend_Config•   I18N            ...
Componentes de ZF•   MVC•   Database•   I18N•   Auth y ACL              Y mucho más•   Web Services•   Mail, Formats, Sear...
Sepamos diferenciar:• Frameworks   • Full Stack   • Microframeworks• Component Library• Content Management System
Ejemplos•   Frameworks     • Full Stack          • Zend Framework          • Symfony          • CakePHP          • CodeIgn...
Filosofía de Zend Framework• Simplicidad y Extensibilidad   – Soluciones fáciles para el 80% de la funcionalidad comúnment...
Proceso de Calidad ZF1.   Cuéntanos que es lo que propones     1.   Redactar el Proposal Document2.   Impleméntalo     1. ...
Usos de ZF• Como Full Stack web framework    – Aplicaciones web• Como Component Library    – Cron Jobs        • cron_impor...
Patrón MVC
COMPARACIONES CON OTROS FRAMEWORKS
Agenda Definiciones Comparaciones con otros Frameworks   • Cuadro Comparativo   • Pros & Cons ZF Anatomía de una Aplica...
CakePHP       CodeIgniter             Symfony              Yii               ZFLicencia           MIT                OSL  ...
CakePHP      CodeIgniter        Symfony   Yii   ZFPHP4                 SI            SI              NO      NO    NOPHP5 ...
PROS                         CONS•   Open Source           •   Menos CoC que otros FWs•   Bajo acoplamiento     •   Menos ...
ANATOMÍA DE UNA APLICACIÓN ZEND
Agenda Definiciones Comparaciones con otros Frameworks Anatomía de una Aplicación Zend    Estructura de directorios   ...
Estructura de directorios
Directorio publicDocumentRoot
MVC
Relación entre Controladores y Vistas
public/index.php<?php// index.php// .../** Zend_Application */require_once Zend/Application.php;// Create application, boo...
application/configs/application.ini
Bootstrap• La clase Bootstrap define que recursos y componentes  que se deben inicializar.• De forma predeterminada, el Fr...
Bootstrap por defecto           al crear un proyecto<?phpclass Bootstrap extends Zend_Application_Bootstrap_Bootstrap{}?>
Bootstrap con métodos _init*<?phpclass Bootstrap extends Zend_Application_Bootstrap_Bootstrap{    protected function _init...
Ejemplos de métodos de Bootstrap
Ejemplos de métodos de Bootstrap
Controllers
Controlador Zend<?phpclass IndexController extends Zend_Controller_Action{    public function init()    {    }    public f...
Pasar variables del controlador a la vista                   A través de         $this->view->var = „valor„;        $this-...
Front Controller• Zend_Controller_Front implementa el patrón Front  Controller usado en aplicaciones MVC .• También implem...
¿Cómo es posible que capture todas las peticiones?                                          .htaccessRewriteEngine OnRewri...
Views
Vista<?php    // recibe variables del controlador    echo $this->variable;?>
Es correcto usar short_open_tag=On?    <?=$this->variable?>
Es correcto usar short_open_tag=On?    <?=$this->variable?>
short_open_tag = On            PROS                                        CONS • Legibilidad                           • ...
Escapar cadenas en la vista  <?php      // mala idea      echo $this->variable;      // buena práctica      echo $this->es...
Models
Models
No existe Zend_ModelNo existe una forma específica de     implementar modelos
Qué hacen los modelos?•    Persistencia de datos    • Obtener    • Guardar    • Modificar    • Borrar
Cómo?•   Bases de datos•   Web Services•   Feeds•   Archivos•   Enumeraciones•   Etc.
Cómo?•   Bases de datos      Escenario Común•   Web Services•   Feeds•   Archivos•   Enumeraciones•   Etc.
Zend_Db• Zend_Db_Adapter• Zend_Db_Statement• Zend_Db_Profiler• Zend_Db_Select• Zend_Db_Table• Zend_Db_Table_Row• Zend_Db_T...
Zend_Db_Adapter                   Configuracion en application.iniresources.db.adapter = pdo_mysqlresources.db.isDefaultAd...
Zend_Db_Table
Zend_Db_Selectpublic function listar() {    $db = $this->getAdapter();    $filas = $db->select()        ->from($this->_nam...
Zend_Db_Select$filas = $db->select()    ->from(        $this->_name,        array(id_producto=>id,              producto=>...
Forms
Zend_Form simplifica la creación y manejo de formularios ennuestra aplicación web. Realiza las siguientes tareas:• Agregar...
Layout
Configurar el LayoutPath
Módulos
Misma estructura de una app  Dentro de cada Modulo.
Podemos setear configs de módulo           application.ini
View Helpers
View Helpers• En los templates es frecuente hacer acciones varias veces:   • Formatear fechas   • Bloques   • Widgets   • ...
View Helpers• En los templates es frecuente hacer acciones varias veces:   • Formatear fechas   • Bloques   • Widgets   • ...
Zend_View_Helper_*    •   url();    •   partial()    •   partialLoop();    •   placeHolder();    •   doctype();    •   hea...
Nuestros propios View Helpers
View Helpers de Módulo      View Helpers de AplicaciónRegistrar View Helpers de Aplicación en Bootstrap
En que orden ocurren las cosas detrás de Zend?
Plugins
Ejemplos Plugins: Routerclass My_Controller_Plugin_Routes extends Zend_Controller_Plugin_Abstract{    public function rout...
Ejemplos Plugins: ACLclass My_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract{    public function preDispatc...
Registramos los plugins en el bootstrapprotected function _initPlugins(){    Zend_Controller_Front::getInstance()->registe...
Action Helpers
Action Helpers• Permite a los desarrolladores injectar funcionalidad ya sea en tiempo  de ejecución o a demanda a los cont...
Ejemplo Action Helperclass My_Controller_Action_Helper_Authextends Zend_Controller_Action_Helper_Abstract {    protected $...
Registrando los Action Helpers en el                 bootstrap// bootstrapprotected function _initActionHelpers(){    Zend...
Ejemplo Action Helperclass My_Controller_Action_Helper_Randextends Zend_Controller_Action_Helper_Abstract{    public funct...
Usando los Action Helperspublic function actionHelpersAction() {    if ($this->isAuth) {        $this->log->debug($this->a...
MANTENIBILIDAD
Agenda Definiciones Comparaciones con otros Frameworks Anatomía de una Aplicación Zend Recomendaciones para lograr Man...
Parametrización    • El objetivo es evitar futuros cambios de código en la aplicación; ADECSYSadecsys.wsdl = "http://dev.w...
Parametrizaciónapis.facebook.appid = “jm97239j872398"apis.facebook.appsecret = “0r09340980j95f834095jf3098d039486j403gj"ap...
Parametrización[subjects]nuevoUsuario = {%subjectMessage%} a Aptitus.pe, {%nombre%}„nuevoAdm = Bienvenido a Aptitus.penuev...
DRYDon’t Repeat Yourself
Don’t Repeat YourselfAprovechar Helpers
Coding StandardsDEMO: PHP_CodeSniffer
Coding StandardsLink:   http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php
Motivación• Código  –   Legible  –   Comprensible  –   Testeable  –   Mantenible
Reglas Simples
Regla:Solo un nivel de Indentación por método
Solo un nivel de Indentación por método
Solo un nivel de Indentación por método
Solo un nivel de Indentación por método
Solo un nivel de Indentación por método
Solo un nivel de Indentación por método
Solo un nivel de Indentación por método
Solo un nivel de Indentación por método
Solo un nivel de Indentación por método
Solo un nivel de Indentación por método
Regla:         No usar else
No usar else
No usar else
No usar else
No usar else
Regla:         Solo una flecha por línea
Solo una flecha por líneaZend_Auth::getInstance()->getStorage()->read()->write();        • Incrementa la dificultad de enc...
Solo una flecha por línea     • Usando Interfaz fluida
Solo una flecha por línea$user->getLocationPoint()->getCountry()->getName();   • En varias lineas a no ser que sean setter...
Regla:    Mantener las clases pequeñas• Max. 100 líneas por Clase• Max 15 Clases por Paquete
Regla:         Documenta tu código
Documenta tu código
Documenta tu código
Grupo de Discusión: php-standards   Link   http://groups.google.com/group/php-standards
ALTA DISPONIBILIDAD
Agenda Definiciones Comparaciones con otros Frameworks Anatomía de una Aplicación Zend Recomendaciones para lograr Man...
• Performance  •       Base de Datos      •      Indices
• Performance  •       Base de Datos      •      Indices          SELECT * FROM empresa WHERE ruc=$ruc
• Performance  •       Base de Datos      •      Desnormalizar
• Performance  •       Zend_Paginator      •      Uso Incorrecto
• Performance  •       Zend_Paginator      •      Uso Correcto
• Performance  •       Zend_Cache      •     El dilema• Alta Disponibilidad VS. Consistencia
• Performance  •       Zend_Cache      •     Uso
• Performance  •       Zend_Cache      •     Adaptadores
• Performance  •       Zend_Cache      •     Cache Metadata                             Metadata
• Performance   •       Zend_Cache       •     Cache Metadataresources.db.adapter = pdo_mysqlresources.db.isDefaultAdapter...
• Escalabilidad  Habilidad para poder incrementar la carga de trabajo        sin que esto afecte la calidad del servicio.
• Escalabilidad      “Languages, libraries and frameworks dont scale.                                     Architectures do”
• Escalabilidad    Si la aplicación va a ser desplegada en un ambiente  distribuido, se deben de tomar algunas consideraci...
• Escalabilidad    •       Carga distribuida        •      Zend_Sesion_SaveHandler_DbTableresources.session.saveHandler.cl...
• Escalabilidad     •       Carga distribuida         •      Evitar Links Duros<a href="http://myapp.info/usuario/agregar"...
SEGURIDAD
Agenda Definiciones Comparaciones con otros Frameworks Anatomía de una Aplicación Zend Recomendaciones para lograr Man...
DEMO
GRACIAS
[El comercio]php zend framework (speech)
[El comercio]php zend framework (speech)
[El comercio]php zend framework (speech)
[El comercio]php zend framework (speech)
[El comercio]php zend framework (speech)
Próxima SlideShare
Cargando en…5
×

[El comercio]php zend framework (speech)

3.008 visualizaciones

Publicado el

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

Publicado en: Tecnología
2 comentarios
3 recomendaciones
Estadísticas
Notas
Sin descargas
Visualizaciones
Visualizaciones totales
3.008
En SlideShare
0
De insertados
0
Número de insertados
122
Acciones
Compartido
0
Descargas
187
Comentarios
2
Recomendaciones
3
Insertados 0
No insertados

No hay notas en la diapositiva.

[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

×