2. #symfonyproweb Symfony2: Framework para PHP5
Índice
✔
¿Qué es un framework y por qué usarlo?
✔ Frameworks PHP
✔ ¿Por qué elegir Symfony?
✔ Primeros pasos
✔
Enlaces de interés
✔
Preguntas
Raúl Fraile Beneyto
3. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔
Organización del proyecto
✔
Estructura de archivos y carpetas
✔ Estructura lógica (namespaces)
✔ Estilo de programación
Ventaja: Si una nueva persona se une al proyecto,
puede estar trabajando en él en muy poco tiempo.
Raúl Fraile Beneyto
4. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔
Modelo Vista Controlador integrado
✔
Separación de la lógica de negocio y la
presentación de la información.
✔ Varios entornos (desarrollo, test y producción).
Ventaja: Facilidad para repartir tareas. Por ejemplo,
los diseñadores sólamente tocarían las vistas.
Raúl Fraile Beneyto
5. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔
Modelo Vista Controlador integrado
Raúl Fraile Beneyto
6. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔
Bases de datos
✔
Independencia del tipo de base de datos
✔ Mapeado en clases (entidades) del esquema
relacional.
✔ Fixtures con datos de prueba.
✔ Optimización de consultas para el SGBD utilizado.
Raúl Fraile Beneyto
7. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔
Detección de bugs
✔
Nos proporciona más información de la pila de
errores o excepciones.
✔ Sabemos exactamente si es un error del modelo
(base de datos), de la vista o del controlador.
✔ Al escribir menos código hay menos posibilidades
de generar nuevos bugs.
Raúl Fraile Beneyto
8. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔
Publicación de la aplicación
✔
Si proporciona algún método para publicar la
aplicación en producción, evitamos olvidos al subir
archivos o hacerlo en orden incorrecto.
✔ Herramientas como Ant o Phing ya hacen esa labor
sin necesidad de un framework.
Raúl Fraile Beneyto
9. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔
Formularios
✔
Generación automática de formularios a partir del
modelo.
✔ Validaciones y tipos de datos predefinidos (fechas,
emails, URLs...).
Raúl Fraile Beneyto
10. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔ Seguridad
✔ Seguridad integrada ante ataques XSS (Cross-site
scripting), CSRF (Cross Site Request Forgery), SQL
Injection...
Raúl Fraile Beneyto
11. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔
Otras ventajas
✔
Tests integrados
✔ Helpers
✔ Caché
✔ Plugins
✔
Posibilidad de extenderlo y adaptarlo a tus
necesidades.
Raúl Fraile Beneyto
12. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
Raúl Fraile Beneyto
13. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
No reinventes la rueda
Raúl Fraile Beneyto
14. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔
También tiene algunas desventajas:
✔
Te puede llegar a limitar en desarrollos algo
“especiales”.
✔ Añade una nueva capa, lo que puede suponer un
deterioro del rendimiento.
● Si no lo dominas en profundidad, pueden llegar a
ser frustrantes.
Raúl Fraile Beneyto
15. #symfonyproweb Symfony2: Framework para PHP5
¿Qué es un framework y por qué usarlo?
✔ En resumen: te hace la vida (un poco) más facil
Raúl Fraile Beneyto
17. #symfonyproweb Symfony2: Framework para PHP5
Frameworks PHP
✔
Intentan suplir algunas de las carencias de PHP
=> organización, separación de lógica y
presentación...
✔
Añadir seguridad. PHP, al ser tan “sencillo”, ha
permitido que casi cualquiera haga
aplicaciones web, muchas de ellas inseguras.
Raúl Fraile Beneyto
18. #symfonyproweb Symfony2: Framework para PHP5
¿Por qué elegir Symfony?
¿Y por qué elegir...?
●
Zend Framework
●
CakePHP
● Codeigniter
● Otro
Lo mejor si tienes tiempo: probar todos los que puedas
Raúl Fraile Beneyto
19. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Framework para PHP creado por Fabien
Potencier (Sensio Labs).
✔ Open-source.
✔
Comunidad muy importante.
✔ Excelente documentación y en diferentes
idiomas (en versiones estables).
✔
Basado en buenas prácticas.
Raúl Fraile Beneyto
20. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
La versión 1.0 salió en Enero de 2007 y
requería PHP 5.0 + (a diferencia del resto de
frameworks).
✔
La última versión estable es la 1.4, que salió
en Noviembre de 2009 y tendrá soporte hasta
Noviembre 2012.
✔
La versión 2 se ha reescrito desde cero.
Raúl Fraile Beneyto
21. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔ Actualmente se encuentra en la versión beta :
2.0.0BETA1
✔ De aquí a la versión final habrán muy pocos cambios,
se centrarán en resolución de bugs y acortar algunos
métodos.
Raúl Fraile Beneyto
22. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Características principales:
✔
Fácil de aprender.
✔ Muy flexible con la introducción de bundles
(framework de frameworks).
✔ Completo.
✔ Rápido.
✔
Utilización de estándares (PHPUnit, Zend_Cache,
Zend_Logger, PHP 5.3 autoload, Java JSR303).
Raúl Fraile Beneyto
24. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Bundles
✔
En Symfony2 TODO son bundles, incluido el propio
framework.
✔ Un bundle es un “paquete” con una estructura
definida, que puede contener cualquier cosa e
implementa una funcionalidad.
✔ Permite utilizar bundles de terceros y compartir
tus propios bundles entre distintos proyectos.
Raúl Fraile Beneyto
25. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Bundles
✔
Algunos de los bundles incluidos en la Standard
Edition:
✔
Assetic: gestor de “assets” para PHP 5.3
– Doctrine: ORM (object relational mapping)
– Monolog: sistema de logs
– SwiftMailer: envío de mails
– Twig: lenguage de plantillas
Raúl Fraile Beneyto
26. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
PHP 5.3
✔
Symfony2 NO FUNCIONA con versiones inferiores a
PHP 5.3.2.
✔ Esta versión de PHP introdujo mejoras importantes
en el rendimiento (hasta un 20% de mejora) y la
inclusión de namespaces.
Raúl Fraile Beneyto
27. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Templates
✔
Se utiliza el patrón “decorator”.
✔ En Symfony se pueden crear las vistas en PHP o en
Twig.
http://www.twig-project.org/
Raúl Fraile Beneyto
28. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Templates: Twig
✔
Lenguage pensado para que gente sin
conocimientos de programación (p.ej.
Maquetadores), puedan utilizar los parámetros que
se le pasan a la vista de una manera más sencilla.
✔
La primera vez que se ejecuta se cachea en PHP
puro, por lo que su rendimiento es bueno.
✔ Dispone de filtros.
Raúl Fraile Beneyto
31. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Templates: Twig
✔
Algunos filtros que se pueden utilizar:
✔
date, replace, url_encode, json_encode, title,
capitalize, upper, lower, striptags, join, reverse,
length...
✔ Funciones integradas
✔ divisibleby, none, even, odd, defined, empty...
✔ Puedes crear tus propias extensiones.
Raúl Fraile Beneyto
32. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Templates: Twig
✔
Se puede integrar en algunos IDEs
✔
PHPStorm 2.1+ tiene soporte nativo.
– Netbeans: https://github.com/blogsh/Twig-netbeans
– Vim: http://jinja.pocoo.org/2/documentation/integration
– Textmate: https://github.com/Anomareh/PHP-Twig.tmbundle
Raúl Fraile Beneyto
33. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Templates: Twig
✔
Utilizando el patrón “decorator”, el template
“padre” deja huecos para que puedan ser
rellenados por el template “hijo”.
Padre Hijo
{% block title %} {% extends "padre.html" %}
Blog Proweb
{% endblock %} {% block title %}Blog Proweb: Contacto{% endblock %}
Raúl Fraile Beneyto
34. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Configuración
✔
La configuración global de la aplicación se
encuentra en /app/config/.
✔ Symfony permite configuración en YAML, XML, PHP
o Annotations.
✔ También permite una configuración distinta por
cada entorno de ejecución (dev, prod, test).
Raúl Fraile Beneyto
35. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Consola
✔
Symfony dispone de una consola de comandos para
poder realizar algunas de las tareas más comunes:
✔
Crear bundles
✔
Limpiar caché / “Calentar” caché
✔ Generar las entidades de la BD
✔
Ejecutar una consulta SQL / DQL
✔ ...
Raúl Fraile Beneyto
36. #symfonyproweb Symfony2: Framework para PHP5
Symfony
Raúl Fraile Beneyto
37. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Base de datos
✔
Se utiliza un ORM: Doctrine o Propel.
● Doctrine mapea la base de datos relacional en
clases (entidades). Incluso crea los getters/setters.
doctrine:mapping:import
doctrine:generate:entities
Raúl Fraile Beneyto
38. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔ Base de datos: persistencia
namespace ProwebBlogBundleController;
use ProwebBlogBundleEntityPost;
class PostController extends Controller
{
public function createAction()
{
$post = new Post();
$post->setTitle('Charla de Symfony');
$post->setContent('<p>La charla sobre Symfony será el 13/05.</p>');
$post->setSlug('charla-symfony');
$em = $this->get('doctrine.orm.entity_manager');
$em->persist($post);
$em->flush();
}
...
Raúl Fraile Beneyto
39. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔ Base de datos: consultas
public function showAction($id)
{
$em = $this->get('doctrine.orm.entity_manager');
$qb = $em->createQueryBuilder();
$qb->select('p')
->from('ProwebBlogBundle:Post','p')
->where('p.id = ?2');
$query = $qb->getQuery();
$query->setParameter(1, $id);
$result = $query->getSingleResult();
...
Raúl Fraile Beneyto
40. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Routing
✔
Se pueden definir las rutas en YAML, XML, PHP o
Annotations.
/**
* @extra:Route("/post/{slug}-{id}", name="_post_view")
* @extra:Template()
*/
public function showAction($slug, $id)
{
[...]
return array('post'=>$post);
}
Raúl Fraile Beneyto
41. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Formularios
✔
Se han simplificado los formularios en esta versión
de Symfony.
✔ Pueden utilizar el modelo para construir los
formularios, incluso adivinando los tipos de campos
y validaciones.
Raúl Fraile Beneyto
44. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Formularios: Recoger datos
$request = $this->get('request');
if ($request->getMethod() == 'POST') {
$form->bindRequest($request);
if ($form->isValid()) {
// se guardaría en base de datos
return $this->redirect($this->generateUrl('store_product_success'));
}
}
Raúl Fraile Beneyto
46. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Admin Generator
✔
En las versiones anteriores de Symfony, había un
generador de “backend”, que permitía crear
paneles de administración en minutos, basándose
en la información de la base de datos y muy
configurable.
✔
En Symfony2 desaparece como parte del
framework => AdminBundle.
Raúl Fraile Beneyto
47. #symfonyproweb Symfony2: Framework para PHP5
Symfony
@s_bergmann
✔
Tests
●
Symfony2 utiliza PHPUnit 3.5.11 (en esta versión
abandonan Lime).
● Cada bundle puede tener una carpeta Tests con
todos los tests unitarios. Está configurado para que
busque los tests en estas carpetas al hacer:
phpunit -c app/
Raúl Fraile Beneyto
48. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Debug
●
Symfony2 proporciona una barra de herramientas
con información muy útil: entorno de ejecución en
el que nos encontramos, controlador que se ha
ejecutado, logs, milisegundos, kb, consultas a la
base de datos...
Raúl Fraile Beneyto
49. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Debug
●
También disponemos de un Profiler que almacena
mucha información sobre la petición. Es una
ampliación de la barra de herramientas.
● Genera un código único por cada petición, por lo
que se pueden recuperar posteriormente.
Raúl Fraile Beneyto
51. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Assetic
✔
Gestor de assets (archivos JS, CSS, imágenes...)
para PHP 5.3.
✔ Viene incluido como Bundle en Symfony.
✔ Permite utilizar herramientas externas (la mayoría
escritas en otros lenguajes como Java o C) para
combinar varios archivos JS o CSS, hacer minify,
optimizar imágenes, utilizar preprocesadores CSS,
optimización de código JS...
Raúl Fraile Beneyto
52. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Assetic: Algunas herramientas que acepta
✔
Coffee Script: lenguaje más simple que JS.
✔ LESS: mejora CSS con variables, funciones...
✔ Google Closure Compiler: optimiza código JS.
✔ JSMin: minify de código JS.
✔
YUI Compressor: minify de JS y CSS.
✔ OptiPNG: optimización de imágenes PNG.
Raúl Fraile Beneyto
53. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔ Assetic: Ejemplo con YUI Compressor
$core = new AssetCollection(
array(
new FileAsset('/js/jquery.js'),
new GlobalAsset('/js/blog/*.js');
), array(
new YuiCompressorJsFilter('/js/yui.jar');
)
);
$core->load();
header('Content-type: text/javascript');
echo $core->dump();
Raúl Fraile Beneyto
54. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Rendimiento
✔
Según algunos benchmarks, Symfony2 es...
2x más rápido que symfony 1.4.2
3.5x más rápido que Zend 1.10
5.5 más rápido que CakePHP
✔
Fabien Potencier define a Symfony2 como “Fast as
Hell”
Raúl Fraile Beneyto
56. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Rendimiento: ¿Cómo lo consigue?
✔
Utiliza PHP 5.3.2
✔ Lazy-loading
✔ Caché interna => archivos de configuración,
templates... todo se cachea.
✔ HTTP Cache
Raúl Fraile Beneyto
57. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Rendimiento: HTTP Cache
✔
Se basa en la especificación HTTP/1.1 y el uso de
ESI (Edge Side Includes), que permite cachear
“trozos” de una misma página en tiempos
distintos.
✔
Es necesario disponer de un proxy caché (p.ej.
Varnish o Squid). Symfony lo lleva integrado.
Raúl Fraile Beneyto
62. #symfonyproweb Symfony2: Framework para PHP5
Symfony
✔
Rendimiento: HTTP Cache
✔
Con Symfony2 podemos simular la comunicación
“proxy cache <=> http server”, utilizando ESI.
$this->render('NoticiasBundle:Default:destacadas.html.twig',
array('noticias'=>$noticias),
array('standalone' => true)
);
URL del fragmento
<esi:include src="http://..." />
Raúl Fraile Beneyto
63. #symfonyproweb Symfony2: Framework para PHP5
Primeros pasos
✔
Hay que tener en cuenta Symfony se
encuentra actualmente en fase beta, pueden
cambiar algunas cosas, hay bugs, la
documentación es incompleta (y errónea en
algunos casos)...
Raúl Fraile Beneyto
64. #symfonyproweb Symfony2: Framework para PHP5
Primeros pasos: Blog del curso Proweb
✔
Descargar “Symfony Standard Edition” de
http://symfony.com/download.
Symfony va a disponer de “distribuciones” (siguiendo
el estilo de Linux). Podrás descargar todo el framework,
componentes sueltos o distribuciones preparadas para
determinados tipos de proyectos.
La Standard Edition ofrece una configuración básica por
defecto y un bundle de prueba.
Raúl Fraile Beneyto
65. #symfonyproweb Symfony2: Framework para PHP5
Primeros pasos: Blog del curso Proweb
✔
Configurar Apache para que apunte a la
carpeta “web”. VirtualHost para acceder más
rápidamente: http://blog_proweb/[...]
✔
Para comprobar que todo está correcto
accedemos a:
http://blog_proweb/app_dev.php/
Raúl Fraile Beneyto
66. #symfonyproweb Symfony2: Framework para PHP5
Primeros pasos: Blog del curso Proweb
Raúl Fraile Beneyto
67. #symfonyproweb Symfony2: Framework para PHP5
Primeros pasos: Blog del curso Proweb
✔
Crear bundle:
✔ Se carga el namespace en /app/autoload.php y
se registra en /app/AppKernel.php:
Raúl Fraile Beneyto
68. #symfonyproweb Symfony2: Framework para PHP5
Primeros pasos: Blog del curso Proweb
✔
La configuración de la base de datos podemos
hacerla manualmente (editando el archivo
/app/config/parameters.ini) o de forma
guiada:
http://blog_proweb/app_dev.php/_configurat
or/
Servidor: localhost
Usuario: user_blog_proweb
Clave: 123456
Base de datos: blog_proweb
Raúl Fraile Beneyto
69. #symfonyproweb Symfony2: Framework para PHP5
Primeros pasos: Blog del curso Proweb
Raúl Fraile Beneyto
70. #symfonyproweb Symfony2: Framework para PHP5
Primeros pasos: Blog del curso Proweb
✔
Mapear BD en clases
Raúl Fraile Beneyto
71. #symfonyproweb Symfony2: Framework para PHP5
Enlaces de interés
symfony.com
Raúl Fraile Beneyto
72. #symfonyproweb Symfony2: Framework para PHP5
Enlaces de interés
symfony.com/blog
Raúl Fraile Beneyto
73. #symfonyproweb Symfony2: Framework para PHP5
Enlaces de interés
symfony.es
Raúl Fraile Beneyto
74. #symfonyproweb Symfony2: Framework para PHP5
Enlaces de interés
symfony2bundles.org
Raúl Fraile Beneyto
75. #symfonyproweb Symfony2: Framework para PHP5
Enlaces de interés
groups.google.com/group/symfony-users
Raúl Fraile Beneyto
76. #symfonyproweb Symfony2: Framework para PHP5
Enlaces de interés
silex-project.org
Raúl Fraile Beneyto
77. #symfonyproweb Symfony2: Framework para PHP5
Enlaces de interés
●
Twitter:
●
@fabpot: Creador de Symfony
● @javiereguiluz: Blog de symfony.com y admin de
symfony.es
● @Kriswallsmith: Creador de Assetic
● @desymfony: Jornadas Symfony en Castellón (1, 2
y 3 de julio)
Raúl Fraile Beneyto
78. #symfonyproweb Symfony2: Framework para PHP5
¡Muchas gracias!
¿Preguntas?
Seguro que sí... ;)
Raúl Fraile Beneyto
79. #symfonyproweb Symfony2: Framework para PHP5
Antes de acabar...
http://twtpoll.com/aazwai
Raúl Fraile Beneyto