SlideShare una empresa de Scribd logo
1 de 151
Descargar para leer sin conexión
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 Mantenibilidad
 Recomendaciones para lograr Alta Disponibilidad
 Recomendaciones de Seguridad
DEFINICIONES
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
¿Qué es un Framework?
¿Qué es un Framework?
¿Qué es un Framework?

•   Herramientas
•   Conceptos
•   Prácticas
•   Criterios



    Enfocados en resolver ciertos tipos de problemas
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.
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…
No Reinventemos la rueda
• 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
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
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
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
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)
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
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
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
Componentes de ZF
•   MVC
•   Database
•   I18N
•   Auth y ACL              Y mucho más
•   Web Services
•   Mail, Formats, Search
•   Utilitarios
Sepamos diferenciar:

• Frameworks
   • Full Stack
   • Microframeworks
• Component Library
• Content Management System
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
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
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
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
        •   scrapers

Lectura Recomendada:
http://www.slideshare.net/shahar/zend-framework-components-for-nonframework-use
Shahar Evron 2008 – colaborador de ZF
Patrón MVC
COMPARACIONES CON OTROS FRAMEWORKS
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
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      Third Party Only   Doctrine, Propel   DAO,            Zend_Db
                   Data Maper                                               Active Record
Testing            Si                 Next Release       Si                 Si              Si


Seguridad          ACL                Si                 Plugin             ACL, RBAC.      ACL
                                                                            Plugins
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
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
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
ANATOMÍA DE UNA APLICACIÓN ZEND
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
Estructura de directorios
Directorio public




DocumentRoot
MVC
Relación entre Controladores y Vistas
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();
?>
application/configs/application.ini
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).
Bootstrap por defecto
           al crear un proyecto
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

}
?>
Bootstrap con métodos _init*
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initFoo()
    {
        // ...
    }

     protected function _initBar()
     {
         // ...
     }

     protected function _initBaz()
     {
         // ...
     }
}
?>
Ejemplos de métodos de Bootstrap
Ejemplos de métodos de Bootstrap
Controllers
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é')
        );
    }
}
Pasar variables del controlador a la vista
                   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 />
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
¿Cómo es posible que capture todas las peticiones?


                                          .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
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                           • 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>
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
Models
Models
No existe Zend_Model


No 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_Table_Rowset
• Zend_Db_Table Relationships
• Zend_Db_Table_Definition
Zend_Db_Adapter
                   Configuracion en application.ini

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'
Zend_Db_Table
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;
}
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();
Forms
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
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
   • Etc.
• Pincipio de funcionamiento: “Desacoplar la data de la presentación”
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
Zend_View_Helper_*
    •   url();
    •   partial()
    •   partialLoop();
    •   placeHolder();
    •   doctype();
    •   headTitle();
    •   headMeta();
    •   headLink();
    •   headStyle();
    •   headScript();
    •   Etc…
Nuestros propios View Helpers
View Helpers de Módulo




      View Helpers de Aplicación




Registrar View Helpers de Aplicación en Bootstrap
En que orden ocurren las
 cosas detrás de Zend?
Plugins
Ejemplos Plugins: Router
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: 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);
    }
}
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()
    );

}
Action Helpers
Action Helpers


• Permite a los desarrolladores injectar funcionalidad ya sea en tiempo
  de ejecución o a demanda a los controladores.
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;
    }
}
Registrando los Action Helpers en el
                 bootstrap
// 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()
     );
}

;Application.ini
resources.frontController.actionhelperpaths.App_Controller_Action_Helper =
                                           "App/Controller/Action/Helper"
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);
    }

}
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);
}
MANTENIBILIDAD
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
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'
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/
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.'
DRY


Don’t Repeat Yourself
Don’t Repeat Yourself


Aprovechar Helpers
Coding Standards


DEMO: PHP_CodeSniffer
Coding Standards




Link:   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ínea


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



        • Incrementa la dificultad de encontrar un error.
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 setters o getters
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 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
• 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 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'
• Escalabilidad


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


      “Languages, libraries and frameworks don't scale.
                                     Architectures do”
• 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
• 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
• 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" />
SEGURIDAD
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
DEMO
GRACIAS

Más contenido relacionado

La actualidad más candente

Divide y Vencerás: introducción a los Microservicios
Divide y Vencerás: introducción a los MicroserviciosDivide y Vencerás: introducción a los Microservicios
Divide y Vencerás: introducción a los MicroserviciosThoughtworks
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menosEduard Tomàs
 
Meetup - NGinx - 08/2014
Meetup - NGinx - 08/2014Meetup - NGinx - 08/2014
Meetup - NGinx - 08/2014mszuchman
 
Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Ricard Clau
 
Escalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEscalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEduard Tomàs
 
SpringIO 2012 Madrid-Escalabilidad con Grails
SpringIO 2012 Madrid-Escalabilidad con GrailsSpringIO 2012 Madrid-Escalabilidad con Grails
SpringIO 2012 Madrid-Escalabilidad con GrailsDomingo Suarez Torres
 
Orquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNextOrquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNextDomingo Suarez Torres
 
Introduccion a SQL Server 2017 en Docker
Introduccion a SQL Server 2017 en Docker Introduccion a SQL Server 2017 en Docker
Introduccion a SQL Server 2017 en Docker Eduardo Castro
 
DevOps Spain 2019. Carlos Landeras-Plain Concepts
DevOps Spain 2019. Carlos Landeras-Plain ConceptsDevOps Spain 2019. Carlos Landeras-Plain Concepts
DevOps Spain 2019. Carlos Landeras-Plain ConceptsatSistemas
 
¿Cómo mezclar agua con aceite? NodeJS + Azure
¿Cómo mezclar agua con aceite? NodeJS + Azure¿Cómo mezclar agua con aceite? NodeJS + Azure
¿Cómo mezclar agua con aceite? NodeJS + AzureNacho Fanjul Corteguera
 
Introduccion Power BI Report Server
Introduccion Power BI Report ServerIntroduccion Power BI Report Server
Introduccion Power BI Report ServerEduardo Castro
 
Grails, opción real y escalable para sitios web de alta carga
Grails, opción real y escalable para sitios web de alta cargaGrails, opción real y escalable para sitios web de alta carga
Grails, opción real y escalable para sitios web de alta cargaDomingo Suarez Torres
 
Desymfony - Servicios
Desymfony  - ServiciosDesymfony  - Servicios
Desymfony - ServiciosRicard Clau
 
Automatización del despliegue de aplicaciones multi cloud
Automatización del despliegue de aplicaciones multi cloudAutomatización del despliegue de aplicaciones multi cloud
Automatización del despliegue de aplicaciones multi cloudSoftware Guru
 

La actualidad más candente (20)

Web Day Devops - Plain Concepts
Web Day Devops - Plain ConceptsWeb Day Devops - Plain Concepts
Web Day Devops - Plain Concepts
 
Divide y Vencerás: introducción a los Microservicios
Divide y Vencerás: introducción a los MicroserviciosDivide y Vencerás: introducción a los Microservicios
Divide y Vencerás: introducción a los Microservicios
 
Docker y todo eso... más o menos
Docker y todo eso... más o menosDocker y todo eso... más o menos
Docker y todo eso... más o menos
 
DevOps made easy with Oracle Cloud
DevOps made easy with Oracle CloudDevOps made easy with Oracle Cloud
DevOps made easy with Oracle Cloud
 
Meetup - NGinx - 08/2014
Meetup - NGinx - 08/2014Meetup - NGinx - 08/2014
Meetup - NGinx - 08/2014
 
Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2Escalabilidad y alto rendimiento con Symfony2
Escalabilidad y alto rendimiento con Symfony2
 
Escalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con KedaEscalando workloads serverless en Kubernetes con Keda
Escalando workloads serverless en Kubernetes con Keda
 
SpringIO 2012 Madrid-Escalabilidad con Grails
SpringIO 2012 Madrid-Escalabilidad con GrailsSpringIO 2012 Madrid-Escalabilidad con Grails
SpringIO 2012 Madrid-Escalabilidad con Grails
 
Orquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNextOrquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNext
 
Introduccion a SQL Server 2017 en Docker
Introduccion a SQL Server 2017 en Docker Introduccion a SQL Server 2017 en Docker
Introduccion a SQL Server 2017 en Docker
 
DevOps Spain 2019. Carlos Landeras-Plain Concepts
DevOps Spain 2019. Carlos Landeras-Plain ConceptsDevOps Spain 2019. Carlos Landeras-Plain Concepts
DevOps Spain 2019. Carlos Landeras-Plain Concepts
 
¿Cómo mezclar agua con aceite? NodeJS + Azure
¿Cómo mezclar agua con aceite? NodeJS + Azure¿Cómo mezclar agua con aceite? NodeJS + Azure
¿Cómo mezclar agua con aceite? NodeJS + Azure
 
Introduccion Power BI Report Server
Introduccion Power BI Report ServerIntroduccion Power BI Report Server
Introduccion Power BI Report Server
 
Data Ops
Data OpsData Ops
Data Ops
 
Grails, opción real y escalable para sitios web de alta carga
Grails, opción real y escalable para sitios web de alta cargaGrails, opción real y escalable para sitios web de alta carga
Grails, opción real y escalable para sitios web de alta carga
 
Desymfony - Servicios
Desymfony  - ServiciosDesymfony  - Servicios
Desymfony - Servicios
 
Gestión de proyectos con Maven
Gestión de proyectos con MavenGestión de proyectos con Maven
Gestión de proyectos con Maven
 
Automatización del despliegue de aplicaciones multi cloud
Automatización del despliegue de aplicaciones multi cloudAutomatización del despliegue de aplicaciones multi cloud
Automatización del despliegue de aplicaciones multi cloud
 
CSIC
CSIC CSIC
CSIC
 
Bases de Datos en Kubernetes
Bases de Datos en KubernetesBases de Datos en Kubernetes
Bases de Datos en Kubernetes
 

Similar a [El comercio]php zend framework (speech)

Zend/Cache de Zend Framework 2
Zend/Cache de Zend Framework 2Zend/Cache de Zend Framework 2
Zend/Cache de Zend Framework 2El Taller Web
 
Servicios en Zend Framework 2
Servicios en  Zend Framework 2Servicios en  Zend Framework 2
Servicios en Zend Framework 2El Taller Web
 
Zend Framework - MVC - 2008
Zend Framework - MVC - 2008Zend Framework - MVC - 2008
Zend Framework - MVC - 2008Juan Carbajal
 
Z-Ray en Zend Server 8
Z-Ray en Zend Server 8Z-Ray en Zend Server 8
Z-Ray en Zend Server 8El Taller Web
 
Módulos en Zend Framework 2
Módulos en Zend Framework 2Módulos en Zend Framework 2
Módulos en Zend Framework 2El Taller Web
 
azure-logic elementos de seleccion cuando utilizarlos
azure-logic elementos de seleccion cuando utilizarlosazure-logic elementos de seleccion cuando utilizarlos
azure-logic elementos de seleccion cuando utilizarloscarlos_eduardo_84
 
Azure 360º para Desarrolaldores
Azure 360º para DesarrolaldoresAzure 360º para Desarrolaldores
Azure 360º para DesarrolaldoresGermán Küber
 
Zend Framework Taller de SeeD Software, Colombia
Zend Framework Taller de SeeD Software, ColombiaZend Framework Taller de SeeD Software, Colombia
Zend Framework Taller de SeeD Software, Colombiarazigal
 
Symfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony FrameworkSymfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony Frameworkexcedesoft
 
Aplicaciones de linea de negocio con silverlight y share point
Aplicaciones de linea de negocio con silverlight y share pointAplicaciones de linea de negocio con silverlight y share point
Aplicaciones de linea de negocio con silverlight y share pointRoberto Carlos
 
Curso: Programación Web con Tecnología Java
Curso:  	Programación Web con Tecnología JavaCurso:  	Programación Web con Tecnología Java
Curso: Programación Web con Tecnología Javaalvaro alcocer sotil
 
ZF Arquitecturas Escalables - Fesoli 2010
ZF Arquitecturas Escalables - Fesoli 2010ZF Arquitecturas Escalables - Fesoli 2010
ZF Arquitecturas Escalables - Fesoli 2010Juan Carbajal
 
DESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEBDESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEBJavier Condori Flores
 
Programacion web
Programacion webProgramacion web
Programacion webtaniamar
 
Programacion web
Programacion webProgramacion web
Programacion webosita30
 
Programacion web
Programacion webProgramacion web
Programacion webrubyski
 
Programacion web
Programacion webProgramacion web
Programacion webdedarisu
 

Similar a [El comercio]php zend framework (speech) (20)

Zend/Cache de Zend Framework 2
Zend/Cache de Zend Framework 2Zend/Cache de Zend Framework 2
Zend/Cache de Zend Framework 2
 
Servicios en Zend Framework 2
Servicios en  Zend Framework 2Servicios en  Zend Framework 2
Servicios en Zend Framework 2
 
Zend Framework - MVC - 2008
Zend Framework - MVC - 2008Zend Framework - MVC - 2008
Zend Framework - MVC - 2008
 
Z-Ray en Zend Server 8
Z-Ray en Zend Server 8Z-Ray en Zend Server 8
Z-Ray en Zend Server 8
 
Mvc
MvcMvc
Mvc
 
Módulos en Zend Framework 2
Módulos en Zend Framework 2Módulos en Zend Framework 2
Módulos en Zend Framework 2
 
azure-logic elementos de seleccion cuando utilizarlos
azure-logic elementos de seleccion cuando utilizarlosazure-logic elementos de seleccion cuando utilizarlos
azure-logic elementos de seleccion cuando utilizarlos
 
Azure 360º para Desarrolaldores
Azure 360º para DesarrolaldoresAzure 360º para Desarrolaldores
Azure 360º para Desarrolaldores
 
Zend Framework Taller de SeeD Software, Colombia
Zend Framework Taller de SeeD Software, ColombiaZend Framework Taller de SeeD Software, Colombia
Zend Framework Taller de SeeD Software, Colombia
 
Symfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony FrameworkSymfony-Community: Introducción a Symfony Framework
Symfony-Community: Introducción a Symfony Framework
 
Aplicaciones de linea de negocio con silverlight y share point
Aplicaciones de linea de negocio con silverlight y share pointAplicaciones de linea de negocio con silverlight y share point
Aplicaciones de linea de negocio con silverlight y share point
 
Curso: Programación Web con Tecnología Java
Curso:  	Programación Web con Tecnología JavaCurso:  	Programación Web con Tecnología Java
Curso: Programación Web con Tecnología Java
 
ZF Arquitecturas Escalables - Fesoli 2010
ZF Arquitecturas Escalables - Fesoli 2010ZF Arquitecturas Escalables - Fesoli 2010
ZF Arquitecturas Escalables - Fesoli 2010
 
DESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEBDESARROLLO RAPIDO DE APLICACIONES WEB
DESARROLLO RAPIDO DE APLICACIONES WEB
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 
Programacion web
Programacion webProgramacion web
Programacion web
 

Último

AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxNombre Apellidos
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.241514949
 
Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel tallerValentinaTabares11
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptchaverriemily794
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxAlexander López
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELmaryfer27m
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMidwarHenryLOZAFLORE
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxJOSEMANUELHERNANDEZH11
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptMiguelAtencio10
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativaAdrianaMartnez618894
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA241531640
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptJavierHerrera662252
 

Último (20)

AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptxCrear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
Crear un recurso multimedia. Maricela_Ponce_DomingoM1S3AI6-1.pptx
 
El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.El uso de las TIC's en la vida cotidiana.
El uso de las TIC's en la vida cotidiana.
 
Excel (1) tecnologia.pdf trabajo Excel taller
Excel  (1) tecnologia.pdf trabajo Excel tallerExcel  (1) tecnologia.pdf trabajo Excel taller
Excel (1) tecnologia.pdf trabajo Excel taller
 
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).pptLUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
LUXOMETRO EN SALUD OCUPACIONAL(FINAL).ppt
 
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptxGoogle-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
Google-Meet-como-herramienta-para-realizar-reuniones-virtuales.pptx
 
El uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFELEl uso delas tic en la vida cotidiana MFEL
El uso delas tic en la vida cotidiana MFEL
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
Mapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptxMapa-conceptual-del-Origen-del-Universo-3.pptx
Mapa-conceptual-del-Origen-del-Universo-3.pptx
 
Hernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptxHernandez_Hernandez_Practica web de la sesion 11.pptx
Hernandez_Hernandez_Practica web de la sesion 11.pptx
 
dokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.pptdokumen.tips_36274588-sistema-heui-eui.ppt
dokumen.tips_36274588-sistema-heui-eui.ppt
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
definicion segun autores de matemáticas educativa
definicion segun autores de matemáticas  educativadefinicion segun autores de matemáticas  educativa
definicion segun autores de matemáticas educativa
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6    CREAR UN RECURSO MULTIMEDIAActividad integradora 6    CREAR UN RECURSO MULTIMEDIA
Actividad integradora 6 CREAR UN RECURSO MULTIMEDIA
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.pptTEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
TEMA 2 PROTOCOLO DE EXTRACCION VEHICULAR.ppt
 

[El comercio]php zend framework (speech)

  • 1. Introducción a PHP Zend Framework Ernesto Anaya Ruiz ernesto.anaya@ec.pe
  • 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
  • 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. ¿Qué es un Framework?
  • 7. ¿Qué es un Framework?
  • 8. ¿Qué es un Framework? • Herramientas • Conceptos • Prácticas • Criterios Enfocados en resolver ciertos tipos de problemas
  • 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. 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…
  • 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.
  • 14. 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
  • 15. 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
  • 16. 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
  • 17. 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)
  • 18. 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
  • 19. 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
  • 20. 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
  • 21. Componentes de ZF • MVC • Database • I18N • Auth y ACL Y mucho más • Web Services • Mail, Formats, Search • Utilitarios
  • 22. Sepamos diferenciar: • Frameworks • Full Stack • Microframeworks • Component Library • Content Management System
  • 23. 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
  • 24. 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
  • 25. 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
  • 26. 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 • scrapers Lectura Recomendada: http://www.slideshare.net/shahar/zend-framework-components-for-nonframework-use Shahar Evron 2008 – colaborador de ZF
  • 29. 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
  • 30. 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 Third Party Only Doctrine, Propel DAO, Zend_Db Data Maper Active Record Testing Si Next Release Si Si Si Seguridad ACL Si Plugin ACL, RBAC. ACL Plugins 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
  • 31. 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
  • 32. 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
  • 33. ANATOMÍA DE UNA APLICACIÓN ZEND
  • 34. 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
  • 37. MVC
  • 39. 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(); ?>
  • 41. 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).
  • 42. Bootstrap por defecto al crear un proyecto <?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { } ?>
  • 43. Bootstrap con métodos _init* <?php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected function _initFoo() { // ... } protected function _initBar() { // ... } protected function _initBaz() { // ... } } ?>
  • 44. Ejemplos de métodos de Bootstrap
  • 45. Ejemplos de métodos de Bootstrap
  • 47. 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é') ); } }
  • 48. Pasar variables del controlador a la vista 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 />
  • 49. 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
  • 50.
  • 51. ¿Cómo es posible que capture todas las peticiones? .htaccess RewriteEngine On RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^.*$ - [NC,L] RewriteRule ^.*$ index.php [NC,L]
  • 52. Views
  • 53. Vista <?php // recibe variables del controlador echo $this->variable; ?>
  • 54. Es correcto usar short_open_tag=On? <?=$this->variable?>
  • 55. Es correcto usar short_open_tag=On? <?=$this->variable?>
  • 56. 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>
  • 57. 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
  • 60. No existe Zend_Model No existe una forma específica de implementar modelos
  • 61. Qué hacen los modelos? • Persistencia de datos • Obtener • Guardar • Modificar • Borrar
  • 62. Cómo? • Bases de datos • Web Services • Feeds • Archivos • Enumeraciones • Etc.
  • 63. Cómo? • Bases de datos Escenario Común • Web Services • Feeds • Archivos • Enumeraciones • Etc.
  • 64. 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
  • 65. Zend_Db_Adapter Configuracion en application.ini 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'
  • 67. 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; }
  • 68. 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();
  • 69. Forms
  • 70. 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
  • 73.
  • 75. Misma estructura de una app Dentro de cada Modulo.
  • 76. Podemos setear configs de módulo application.ini
  • 78. 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”
  • 79. 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
  • 80. Zend_View_Helper_* • url(); • partial() • partialLoop(); • placeHolder(); • doctype(); • headTitle(); • headMeta(); • headLink(); • headStyle(); • headScript(); • Etc…
  • 82.
  • 83. View Helpers de Módulo View Helpers de Aplicación Registrar View Helpers de Aplicación en Bootstrap
  • 84. En que orden ocurren las cosas detrás de Zend?
  • 85.
  • 87. Ejemplos Plugins: Router 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); } }
  • 88. 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); } }
  • 89. 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() ); }
  • 91. Action Helpers • Permite a los desarrolladores injectar funcionalidad ya sea en tiempo de ejecución o a demanda a los controladores.
  • 92. 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; } }
  • 93. Registrando los Action Helpers en el bootstrap // 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() ); } ;Application.ini resources.frontController.actionhelperpaths.App_Controller_Action_Helper = "App/Controller/Action/Helper"
  • 94. 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); } }
  • 95. 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); }
  • 97. 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
  • 98. 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'
  • 99. 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/
  • 100. 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.'
  • 104. Coding Standards Link: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php
  • 105. Motivación • Código – Legible – Comprensible – Testeable – Mantenible
  • 107. Regla: Solo un nivel de Indentación por método
  • 108. Solo un nivel de Indentación por método
  • 109. Solo un nivel de Indentación por método
  • 110. Solo un nivel de Indentación por método
  • 111. Solo un nivel de Indentación por método
  • 112. Solo un nivel de Indentación por método
  • 113. Solo un nivel de Indentación por método
  • 114. Solo un nivel de Indentación por método
  • 115. Solo un nivel de Indentación por método
  • 116. Solo un nivel de Indentación por método
  • 117. Regla: No usar else
  • 122. Regla: Solo una flecha por línea
  • 123. Solo una flecha por línea Zend_Auth::getInstance()->getStorage()->read()->write(); • Incrementa la dificultad de encontrar un error.
  • 124. Solo una flecha por línea • Usando Interfaz fluida
  • 125. Solo una flecha por línea $user->getLocationPoint()->getCountry()->getName(); • En varias lineas a no ser que sean setters o getters
  • 126. Regla: Mantener las clases pequeñas • Max. 100 líneas por Clase • Max 15 Clases por Paquete
  • 127. Regla: Documenta tu código
  • 130. Grupo de Discusión: php-standards Link http://groups.google.com/group/php-standards
  • 132. 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
  • 133. • Performance • Base de Datos • Indices
  • 134. • Performance • Base de Datos • Indices SELECT * FROM empresa WHERE ruc=$ruc
  • 135. • Performance • Base de Datos • Desnormalizar
  • 136. • Performance • Zend_Paginator • Uso Incorrecto
  • 137. • Performance • Zend_Paginator • Uso Correcto
  • 138. • Performance • Zend_Cache • El dilema • Alta Disponibilidad VS. Consistencia
  • 139. • Performance • Zend_Cache • Uso
  • 140. • Performance • Zend_Cache • Adaptadores
  • 141. • Performance • Zend_Cache • Cache Metadata Metadata
  • 142. • 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'
  • 143. • Escalabilidad Habilidad para poder incrementar la carga de trabajo sin que esto afecte la calidad del servicio.
  • 144. • Escalabilidad “Languages, libraries and frameworks don't scale. Architectures do”
  • 145. • 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
  • 146. • 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
  • 147. • 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" />
  • 149. 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
  • 150. DEMO