manos a la obra con yupp php framework
DESCRIPTION
TRANSCRIPT
Manos a la obra conYupp PHP Framework
Pablo Pazos Gutiérrezhttp://code.google.com/p/yupp/
Agenda (1:55)Instalación - 10'Configuración - 5'Estructura del Framework - 5'URLs en Yupp - 5'Creando una aplicación - 10'ORM - 45'• Creando una clase persistente• Configurando la BD por aplicación• Script de arranque (bootstrap)• Relaciones hasOne• Acciones y vistas de infraestructura (scaffolding) • Relaciones hasMany• Verificando restricciones• Uso del belongsTo
Controladores y acciones - 20'Vistas y helpers - 15'
Cap 3: Instalando Yupp
Precondiciones:• Apache, PHP5, MySQL• Instalemos WAMP! (solo para Windows)• MOD_REWRITE activado• No hay restricciones especiales para linux…
• Pero cuidado con los permisos de lectura/escritura de directorios Instalando:• Copiar el directorio de Yupp en el www del WAMP• Acceder a http://localhost/yupp• ¿Vemos el escritorio? Yuppy!
• ¿Nos da un error?, verificar que MOD_REWRITE está activoo LoadModule rewrite_module modules/mod_rewrite.so en httpd.conf
del Apache
Cap 3: Configurando Yupp
Base de Datos:• ¿Error de que no existe la base de datos?
o Crear la base de datos en el PHPMyAdmin http://localhost/phpmyadmin
¿Dónde se define la conexión con la bd? Config: yupp/core/config/core.config.YuppConfig.class.php También se configuran:
Modos de ejecución Idiomas soportados (para i18n) Puntos de entrada al framework
Cap 4: estructura del framework
Estructura del framework:• apps• core
o dbo persistento routingo mvco ...
• css• images• js• .htaccess• index.php
Cap 5: URLs en Yupp
Ejemplo 1: pasaje explícito de paramshttp://localhost/yupp/app/controller/action?param1=value1¶m2=value2• aplicación• controlador• acción• parámetros
Ejemplo 2: pasaje implícito de paramshttp://localhost/yupp/app/controller/action/value1/value2• aplicación• controlador• acción• _param_1, _param_2
Cap 6: Creando una aplicación!
Nueva aplicación:• nombre: "biblioteca"• descripción: "aplicacion para gestion de libros"• lenguage: "es"• controlador: "libro"
Estructura de la aplicación: ver yupp/apps/biblioteca• bootstrap• config• model: clases persistentes del modelo de información• views: generan la interfaz gráfica del usuario• controllers: procesamiento de pedidos de usuarios• tests• app.xml
Cap 6: Creando la clase Libro
Copiar desde:• Aplicacion\cap 6\biblioteca\model\biblioteca.model.Libro.class.php
Hacia:• C:\wamp\www\yupp\apps\biblioteca\model
Expliquemos el código de la clase Libro:• extends PersistentObject• constructor• campos• constructor de superclase
Generemos las tablas!• veamos lo generado: http://localhost/phpmyadmin
Cap 7: Config. de BD por aplicación
Copiar desde:• Aplicacion\cap 7\biblioteca\config\db_config.php
Hacia:• C:\wamp\www\yupp\apps\biblioteca\config
Explicación Intentemos regenerar las tablas• Debemos crear la base de datos previamente
Cap 7: Script de arranque
Copiar desde:Aplicacion\cap 7\biblioteca\bootstrap\apps.biblioteca.bootstrap.Bootstrap.script.php
Hacia:C:\wamp\www\yupp\apps\biblioteca\bootstrap
Explicación del código Ejecutemos el script de arranque!• ¿Vemos el contenido en la base?
Cap 8.1 Relaciones hasOne
Nuevo:• Model:
o Clase Autoro Libro hasOne Autor
• Bootstrap:o Ahora crea autores (ejecutar antes que tests)
• Test:o Al primer libro creado en bootstrap le asocia un autor
Procedimiento:• copiar ejemplo• eliminar estructura de la db y regenerar• ejecutemos boostrap • ejecutemos test y miremos la db
Acciones y vistas de infraestructura
Entrar a:http://localhost/yupp/biblioteca/libro/list
Vista "list": auto-generada y navegable• Podemos crear un nuevo libro (create)• Ver los detalles de un libro (show)• Editar los datos de un libro (edit)• Volver al listado (list)• Eliminar un libro (delete)• Navegar hacia el autor del libro (show)
o Notar que ni siquiera hay un controlador creado Tenemos un sistema de información muy básico sin necesidad de programar la lógica de altas, bajas y modificaciones, ni las vistas
Cap 8.2 Relaciones hasMany
Nuevo:• Model:
o Libro tiene varios coautores• Test: (veamos el código)
1.crea un libro y le asocia autor y 2 coautores2.quita uno de los coautores al libro
Procedimiento:• copiar ejemplo• eliminar estructura de la db y regenerar• ejecutemos test y miremos la db
• Primero solo el test 1 y luego solo el test 2
Cap 8.4 Verificando restricciones
Nuevo:• Model: (veamos el código!)
o Restricción en el nombre del autoro Restricción en el número de páginas del libro
• Tests:o Test de validación que falla para mostrar violación de
restricciones Procedimiento:• copiar ejemplo• eliminar estructura de la db y regenerar• ejecutemos test para ver la verificación de restricciones
Cap 8.6 Salvar en cascada: belongsToReglas:
1. A(*)->(1)B: Yupp no sabe cual lado es el fuerte, necesita belongsTo explícito2. A(1)<->(1)B: Yupp no sabe cual es el lado fuerte, necesita belongsTo explícito3. A(1)->(*)B: Yupp considera que B belongsTo A4. A(1)<->(*)B: Yupp considera que B belongsTo A5. A(*)->(*)B: Yupp considera que B belongsTo A6. A(*)<->(*)B: Yupp no sabe cual es el lado fuerte, necesita belongsTo explícito
Importante: Si B belongsTo A, cuando una instancia de A tiene uno (hasOne) o muchos (hasMany) Bs, al salvar A, se salvan sus Bs asociados (en cascada).
Cap 8.6 Salvar en cascada: belongsToNuevo:• Modelo:
o Autor belongsTo Libroo Explício porque es Libro(*)->(1)Autor
• Tests:o Salvar en cascada hasOne (gracias al belongsTo)
Procedimiento:• copiar ejemplo• no es necesario regenerar porque no cambió la estructura• ejecutemos test para ver que el libro salva su autor en
cascada
No vamos a mostrar ejemplo para ahorrar tiempo, lo pueden probar luego.
Cap 9: Controladores
Nuevo:• Acciones en LibroController (veamos el código!)
o redirect en acción "index"o generación de JSONo generación de XML
• Bootstrapo Da de alta algunos libros con autor y coautores
Procedimiento:• borrar el contenido de las tablas en la bd
• Como no cambiamos el modelo, no cambia la estructura, entonces no necesitamos regenerar las tablas.
• ejecutar el bootstrap
Cap 9: Controladores
Prueba 1: redirección• Acción index del controlador LibroController redirige a "list"• return $this->redirect( array('action'=>'list') );• Ver el comportamiento del pedido HTTP
Prueba 2: generación de JSON• http://localhost/yupp/biblioteca/libro/jsonShow?id=1• Probemos la generación recursiva!
Prueba 3: generación de XML• http://localhost/yupp/biblioteca/libro/xmlShow?id=1• Probemos la generación recursiva!
10. Vistas
Nuevo:• Vistas:
o views/libro/list.view.phpo views/libro/details.template.php
• Controladores y acciones:o Acción "list" implementada en LibroControllero Se agrega sleep a acción jsonShow
para prueba de helper ajax_link
Proceso:• Copiamos cosas nuevas• Explicación del código del controlador• Explicación del código de la vista• Probamos vista y ajax_link• Probamos template, descomentando el código en la vista
Conclusiones
Múltiples usuarios:
Conclusiones
Agilidad:• Quitar tareas tediosas y repetitivas• Subir el nivel del desarrollo
o Programar el modelo de objetos, sin necesidad de diseñar el modelo de bases de datos
o Poco o nada de programar y mantener SQL• Programación estandarizada
o Estructuras y convenciones conocidas y predecibles
Conclusiones
Agilidad:• Pequeña curva de aprendizaje
o Una vez superada, se saca jugo a las convencioneso La performance de programación aumentao Rápido prototipado: "algo para mostrarle al cliente"o Liberaciones frecuentes, mejora visibilidad y feedback
• Flexible para implementar cualquier tipo de sistema web• Flexible para integrar con otros sistemas• Diseñado para extenderse y adaptarse a nuevas
necesidades
¿Cómo seguir?Documentación http://www.simplewebportal.net/yupp_framework_php_doc
Grupohttp://groups.google.com/group/yuppframeworkphp
Bloghttp://yuppframework.blogspot.com Sitio en Google Codehttp://code.google.com/p/yupp
Código fuente (SVN de desarrollo)http://yupp.googlecode.com/svn/trunk/YuppPHPFramework/
Bugshttp://code.google.com/p/yupp/issues/list
¡Gracias!
Pablo Pazos Gutié[email protected]