@raulfraile
Índice - Qué es un framework y por qué utilizarlo? Frameworks PHP Symfony y Symfony2 Primer proyecto con Symfony2 Características interesantes de Symfony2 Enlaces de interés
Qué es un framework y por qué utilizarlo? 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. Un framework simplifica el desarrollo de una aplicación mediante la automatización de algunos de los patrones utilizados para resolver las tareas comunes. Además, proporciona estructura al código fuente, forzando al desarrollador a crear código más legible y más fácil de mantener. Por último, facilita la programación de aplicaciones, ya que encapsula operaciones complejas en instrucciones sencillas.
Problemas en la fase de desarrollo Definir una estructura lógica del proyecto - Crear una estructura de directorios propia Dividimos por módulos? Cada módulo en su carpeta? Cómo mapeamos la base de datos? Dónde metemos los tests unitarios? Cómo llamamos a la carpeta de imágenes? En definitiva: Organización del proyecto Problema: Si entra una persona nueva al proyecto hay que explicárselo TODO
Problemas en la fase de desarrollo Separación de la lógica de negocio y la presentación Aplicaciones web con un.php por cada página, que accede a base de datos, obtiene los resultados y genera el HTML, todo en el mismo fichero... Una posible solución: Modelo Vista Controlador (MVC)
Modelo Vista Controlador Puerta de entrada a la aplicación: p.ej.: index.php Representación de los datos Acceso a los datos p.ej.: código HTML, RSS... p.ej.: base de datos, servicios Web, ficheros externos...
Problemas en la fase de desarrollo Dependencia del tipo de base de datos A no ser que utilicemos alguna librería para acceso a base de datos, nuestras consultas serán dependientes de la base de datos utilizada. Un cambio de tipo de base de datos (p.ej. De MySQL a SQL Server) nos obligaría a revisar las consultas. Mapeado de la base de datos Tendremos que crear una serie de clases para mapear las tablas de la base de datos (p.ej. Tabla Producto, class.producto.php). Un cambio en las tablas obliga a modificar las clases.
Problemas en la fase de desarrollo Detección de bugs Conforme la aplicación va creciendo se va ensuciando y cada vez es más dificil encontrar los errores. Los tests unitarios y la obligación de mantener la estructura pueden facilitar la tarea. Publicar la aplicación Si no utilizamos una herramienta tipo Ant o Phing se pueden producir errores al olvidar subir algún archivo modificado o en orden incorrecto.
Problemas en la fase de desarrollo Formularios Tareas repetitivas de validar los datos introducidos, mostrar mensajes de error, no perder los datos introducidos cuando se produce un error...
Frameworks PHP framework.zend.com cakephp.org yiiframework.com akelos.org symfony-project.org codeigniter.com
Qué es Symfony? - Framework PHP5 Creado por Fabien Potencier en 2007. Open-source Muy utilizado Comunidad muy grande Buena documentación Basado en buenas prácticas
Symfony Versiones
Proyecto nuevo o actualización? Entonces uso Symfony 1.4 o Symfony2? DEPENDE... Cuándo va a estar en producción? Cuál es la versión actual de PHP?
Entonces uso Symfony 1.4 o Symfony2? Opinión personal: Aprender Symfony2 - La PR4 de Symfony2 tiene TODO lo que tendrá la versión final. va a ser mejor que - Symfony2 le va a dar 1.000 patadas a Symfony 1.4
Problemas de Symfony 1.4: Muchos archivos Configuración compleja Dificil de aprender Formularios Rendimiento
Symfony2 soluciona estos problemas: - Menos archivos Mucho más fácil de aprender Más flexible Completo Utilización de estándares (PHPUnit, Zend_Cache, Zend_Logger, PHP 5.3 autoload, Java JSR303)
Primer proyecto con Symfony2
Crear un proyecto con Symfony2 1) Bajar el sandbox GIT: git clone http://github.com/symfony/symfony-sandbox.git SVN: checkout http://svn.symfony-project.com/branches/2.0 URL: http://symfony-reloaded.org/downloads/sandbox_2_0_pr4.zip (*.tgz)
Crear un proyecto con Symfony2 Una carpeta por cada aplicación Algunos scripts TODO el código de la aplicación Carpeta pública: CSS, JS...
Crear un proyecto con Symfony2 Punto de entrada al entorno de desarrollo Código HTML generado por la aplicación Barra de herramientas
Crear un proyecto con Symfony2
Crear un proyecto con Symfony2 /web/app_dev.php (Controlador frontal)
Crear un proyecto con Symfony2 /app/config/routing.yml (Configuración global de las URL) /src/hellobundle/resources/config/routing.yml (Configuración de las URL del bundle) Configuración en cascada
Crear un proyecto con Symfony2 /src/application/hellobundle/controller/hellocontroller.php (Configuración)
Plantillas PHP /src/application/hellobundle/resources/views/hello/index.php (Vista) /src/application/hellobundle/resources/views/hello/layout.php /app/views/hello/layout.php
Plantillas con Twig Las plantillas pueden estar escritas en PHP o Twig Twig: Template Engine - Más facil para los diseñadores Muy rápido (se compila a PHP) Conciso Completo twig-project.org
Plantillas con Twig /src/application/hellobundle/resources/views/hello/index.twig (Vista) /src/application/hellobundle/resources/views/hello/layout.twig /app/views/hello/layout.php
Acceso a base de datos BD = Estructura relacional ORM object-relational mapping Evita utilizar una sintaxis específica de un sistema de bases de datos concreto PHP5 y Symfony = Orientados a objetos
Acceso a base de datos ORMs:
Acceso a base de datos Configuración de la Base de Datos /app/config/config.yml Si la base de datos existe, podemos pedirle a Doctrine que mapee las tablas Comando doctrine:mapping:import Si la base de datos NO existe, podemos crear las clases nosotros mismos. Después, se creará la base de datos a partir de esas clases Comandos - doctrine:database:create - doctrine:schema:create
Acceso a base de datos Cómo crearíamos una actividad nueva en la BD?
Acceso a base de datos Y obtener todas las actividades de la BD? SELECT a.id, a.titulo, a.aforo FROM actividad a
Acceso a base de datos Y obtener todas las actividades de la BD? Plantilla:
Formularios Creamos un formulario para introducir una actividad /src/application/hellobundle/controller/hellocontroller.php
Formularios Creamos un formulario para introducir una actividad /src/application/hellobundle/resources/views/hello/nueva.php Y para recibir los datos del formulario?
Formularios Creamos un formulario para introducir una actividad /src/application/hellobundle/controller/hellocontroller.php
Formularios Algunos controles predefinidos en Symfony2 BÁSICOS TextField TextAreaField CheckboxField ChoiceField PasswordField HiddenField CON INTERNACIONALIZACIÓN NumberField IntegerField PercentField MoneyField DateField BirthdayField TimeField DateTimeField TimezoneField OTROS RepeatedField Raúl Fraile Beneyto FieldGroup CollectionField
Características interesantes de Symfony2
Bundles
Bundles Qué es un bundle? - Un bundle es un paquete con una estructura definida, que puede contener cualquier cosa (clases, controladores, css...). - Implementa una funcionalidad. - Todo en Symfony2 son bundles. - Sustituye a algunos conceptos de symfony 1 (plugins, librerías...) - Permite una gran flexibilidad
Bundles Symfony2 está formado por Bundles:
Bundles Aparte de los bundles oficiales, podemos añadir a nuestro proyecto Bundles creados por terceros: - FacebookBundle - TwitterBundle - SitemapBundle - HTMLPurifierBundle - La versión 4 de phpbb se está programando como bundle de Symfony2
Helpers
Helpers A diferencia de symfony 1.4, los helpers en Symfony2 son objetos. Nos ayudan a generar código HTML. P.ej. Generar la ruta de una imagen: <img src="<?php echo $view['assets']->geturl('images/logo.png')?>" /> Ventaja: si cambiamos el DocumentRoot, no haría falta cambiar NADA.
P.ej. Incluir CSS y JavaScripts Helpers <?php $view['javascripts']->add('js/actividades.js')?> <?php echo $view['javascripts']?> <?php $view['stylesheets']->add('css/estilos.css')?> <?php echo $view['stylesheets']?> Ventaja: Las vistas, al extenderse, se van acumulando los CSS y JS.
P.ej. Generar un enlace Helpers <a href="<?php echo $view['router']->generate('hello', array('name' => 'Raul'))?> "> Hola Raúl!</a> Generaría: <a href= /hello/raul > Hola Raúl!</a> Ventaja: Si las rutas cambian, simplemente haría falta cambiarlo en el routing.yml, y la aplicación seguiría funcionando.
Tests Unitarios PHPUnit
Tests Unitarios - PHPUNit Symfony2 utiliza PHPUnit 3.5 (o superior) como framework de pruebas Manual: http://www.phpunit.de/manual/3.5/en/
Tests Unitarios - PHPUNit assertarrayhaskey() assertclasshasattribute() assertclasshasstaticattribute() assertcontains() assertcontainsonly() assertempty() assertequalxmlstructure() assertequals() assertfalse() assertfileequals() assertfileexists() assertgreaterthan() assertgreaterthanorequal() assertinstanceof() assertinternaltype() assertlessthan() assertlessthanorequal() assertnull() assertobjecthasattribute() assertregexp() assertstringmatchesformat() assertstringmatchesformatfile() assertsame() assertselectcount() assertselectequals() assertselectregexp() assertstringendswith() assertstringequalsfile() assertstringstartswith() asserttag() assertthat() asserttrue() asserttype() assertxmlfileequalsxmlfile() assertxmlstringequalsxmlfile() assertxmlstringequalsxmlstring()
Tests Unitarios - PHPUNit
PHP 5.3.2
PHP 5.3.2 PHP 5.3 introdujo algunas mejoras que utiliza Symfony2 para permitir un desarrollo más rápido y con mejor rendimiento: - Mejora en un 20% el rendimiento. - Permite namespaces
Rápido
Symfony2 es: - 2x más rápido que symfony 1.4.2-3.5x más rápido que Zend 1.10-5.5x más rápido que CakePHP 1.2.6
Por qué es tan rápido? - Utiliza PHP 5.3.2 - Lazy-loading - Caché interna - Acelerador web
Cómo funciona el acelerador web?
Cómo funciona el acelerador web?
Cómo funciona el acelerador web?
Cómo funciona el acelerador web? Guarda páginas COMPLETAS Acelerador Aplicación Apache
60' 60' 1' 10' 60'
Solución? Cacheamos las páginas cada minuto? NO Solución: ESI (Edge Side Includes)
$this->render('hellobundle:hello:novedades.php'); $this->render('hellobundle:hello:novedades.php', array('standalone' => true)); <esi:include src=... />
Enlaces de interés
symfony-reloaded.org
symfony-project.org/blog
symfony.es
symfony2bundles.org
@fabpot
MUCHAS GRACIAS!!!! Twitter: @raulfraile Email: raulfraile@gmail.com