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
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
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
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()
{
// ...
}
}
?>
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]
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
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
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
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()
);
}
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'
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.'
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
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
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