Your SlideShare is downloading. ×
  • Like
Silex, desarrollo web ágil y profesional con PHP
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Silex, desarrollo web ágil y profesional con PHP

  • 13,425 views
Published

Silex es el microframework de moda en el mundo PHP. Silex te permite desarrollar aplicaciones web profesionales con una agilidad sin precedentes. Su aprendizaje es tan rápido y sencillo que podrás …

Silex es el microframework de moda en el mundo PHP. Silex te permite desarrollar aplicaciones web profesionales con una agilidad sin precedentes. Su aprendizaje es tan rápido y sencillo que podrás dominarlo en menos de una hora.

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
  • Mucho gracias por estas diapositivas! E una introducción muy util.

    No hablo perfectamente el Español, pero ha traducido estas diapositivas en Ingles por mi equipo: https://dl.dropboxusercontent.com/u/7494143/silex-130128011107-phpapp02-EN.pdf

    No tengo todos las fuentes, pero puedes leerlo...
    Are you sure you want to
    Your message goes here
  • Javier, como siempre, tu presentación se sale! Gracias por compartir!
    Are you sure you want to
    Your message goes here
  • ¡Genial! Por cierto, me gusta mucho tu definición de Silex: 'elegante, ágil y sencillo'.
    Are you sure you want to
    Your message goes here
  • Hola Javier, el sabado estuve escuchando tu charla en BilboStack y ahora mismo estoy liado con Silex, me parecio elegante, agil y sencillo, gracias por la gran aportación
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
13,425
On SlideShare
0
From Embeds
0
Number of Embeds
10

Actions

Shares
Downloads
220
Comments
4
Likes
18

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Silex desarrollo web ágil y profesional con PHPBILBOSTACK JAVIER EGUILUZ26 ENERO 2013
  • 2. Gracias a la organización.Asier Fran Ibon Vicenç
  • 3. Agenda 1. Introducción 2. Programando aplicaciones 3. DEMO 4. Buenas prácticas 5. Puntos débiles
  • 4. Introducción
  • 5. ¿Por qué?
  • 6. En el mundo de los negocios...1. Rápido2. Barato3. Bueno
  • 7. En el mundo de los negocios...1. Rápido ELIGE DOS2. Barato3. Bueno
  • 8. En el mundo de la programación...1. Bien hecho2. Terminado a tiempo3. Barato
  • 9. En el mundo de la programación...1. Bien hecho ELIGE UNA2. Terminado a tiempo3. Barato
  • 10. En el mundo de la programación...✔ Bien1. hecho✔ Terminado a tiempo2.✔ Barato3. Con Silex puedes tenerlo todo
  • 11. ¡no tengo¡quiero hacerlo bien! tiempo!
  • 12. ¿Qué es Silex?
  • 13. Foto: Wikipedia
  • 14. Curiosity (2012) Sojourner (2007)Foto: Wikipedia
  • 15. Sojourner Curiosity (2007) (2012)Masa 11 kg 900 kgCoste ($) 150 M 1.800 MMemoria RAM 64 KB 256 MBCPU 2 MHz 200 MHz
  • 16. Es importante tener en cuenta que...• El grande jamás podrá ser tan ágil como el pequeño.• El pequeño jamás podrá competir en potencia y funcionalidad con el grande.
  • 17. SilexThe PHP micro-frameworkbased on the Symfony2Components el logo de Silex
  • 18. los dos son frameworks y usan los mismos componentes, pero...
  • 19. ...Symfony es un framework muy grande y Silex es un framework muy pequeño
  • 20. Silex Symfony2Peso 5 MB 8 MBArchivos 3.366 6.578Nivel dificultadFlexibilidad
  • 21. Los creadores de SilexIgor Wiedler Fabien Potencier@igorw @fabpot
  • 22. + fácil + calidad- calidad - facil
  • 23. + fácil + calidad- calidad - facil
  • 24. Programando aplicaciones
  • 25. Funciones anónimas y closures
  • 26. Función normalfunction suma($a, $b) { return $a + $b;}
  • 27. Función anónimafunction ($a, $b) { return $a + $b;}
  • 28. Usando una función anónima$app->get(..., function ($a, $b) { return $a + $b;});
  • 29. Closure$a = 3;function ($b) { return $a + $b;}
  • 30. Closure$a = 3; NO FUNCIONAfunction ($b) { return $a + $b;}
  • 31. Closure$a = 3;function ($b) use ($a) { return $a + $b;}
  • 32. El código más común de Silex$app->get(..., function ($var) use ($app) { // ...});
  • 33. El primer ejemplo
  • 34. Holamundo.
  • 35. http://bilbostack.com/hola
  • 36. Hola Mundo en Silexrequire_once __DIR__./../vendor/autoload.php;$app = new SilexApplication();$app->get(/hola, function() { return Hola mundo;});$app->run();
  • 37. Cargar clases automáticamenterequire_once __DIR__./../vendor/autoload.php;$app = new SilexApplication();$app->get(/hola, function() { return Hola mundo;});$app->run();
  • 38. Crear la aplicación Silexrequire_once __DIR__./../vendor/autoload.php;$app = new SilexApplication();$app->get(/hola, function() { return Hola mundo;});$app->run();
  • 39. Ejecutar código para una URLrequire_once __DIR__./../vendor/autoload.php;$app = new SilexApplication();$app->get(/hola, function() { return Hola mundo;});$app->run();
  • 40. Arrancar la aplicaciónrequire_once __DIR__./../vendor/autoload.php;$app = new SilexApplication();$app->get(/hola, function() { return Hola mundo;});$app->run();
  • 41. Hola Mundo en Silexrequire_once __DIR__./../vendor/autoload.php;$app = new SilexApplication();$app->get(/hola, function() { return Hola mundo;});$app->run();
  • 42. Sinatra / Rubyrequire sinatraget /hola do "Hola mundo."end
  • 43. node.js / JavaScriptvar http = require(http);http.createServer(function (request, response) { response.writeHead( 200, { Content-Type: text/plain } ); response.end(Hola mundon);}).listen(80);
  • 44. Un ejemplo real
  • 45. Fo rk m eo ngithub.com/ Gi tH ubjaviereguiluz/bilbostack
  • 46. Enrutamiento
  • 47. Ruta de la portada$app->get(/, function () use ($app) { // ...});
  • 48. Ruta básica$app->get(/agenda, function () use ($app) { // ...});
  • 49. Ruta con partes variables$app->get(/speakers/{slug}, function () use ($app) { // ...});
  • 50. Ruta con partes variables$app->get(/speakers/{slug}, function () use ($app) { // ...});
  • 51. Ruta con partes variables$app->get(/speakers/{slug}, function () use ($app) { // ...});/speakers/pablo-garaizar/speakers/carlos-sanchez/speakers/esto-esta-mal
  • 52. Otros métodos HTTP$app->post(/registro, function () use ($app) { // ...});
  • 53. Otros métodos HTTP$app->post(/registro, function () use ($app) { // ...});$app->put( );$app->delete( );
  • 54. Ruta para todos los métodos HTTP$app->match(/registro, function () use ($app) { // ...});
  • 55. Ruta para algunos métodos HTTP$app->match(/registro, function () use ($app) { // ...})->method(GET|POST);
  • 56. Rutas con variables$app->get(/speakers/{slug}, function ($slug) { // ...});
  • 57. Rutas con variables$app->get(/speakers/{track}/{slug}, function ($track, $slug) use ($app) { // ...});
  • 58. Variables especialesuse SymfonyComponentHttpFoundationRequest;$app->get(/speakers/{slug}, function (Request $request, $slug) { // ...});
  • 59. Variables especialesuse SymfonyComponentHttpFoundationRequest;$app->get(/speakers/{slug}, function (Request $request, $slug) { // ...});
  • 60. Variables especialesuse SymfonyComponentHttpFoundationRequest;$app->get(/speakers/{slug}, function (Request $request, $slug) { // ...});$request->server->get(HTTP_USER_AGENT)$request->get(slug)
  • 61. Modificando las variables de la ruta$app->get(/schedule/{slug}, function ($slug) use ($app) { // ...})->convert(slug, function ($slug) { return strtolower($slug);});
  • 62. Modificando las variables de la ruta$app->get(/schedule/{slug}, function ($slug) use ($app) { // ...})->convert(slug, function ($slug) { return str_replace(-, _, $slug);});
  • 63. Restringiendo las variables de la ruta$app->get(/schedule/{track}, function ($track){ // ...})->assert(track, d+);
  • 64. Restringiendo las variables de la ruta$app->get(/schedule/{track}, function ($track){ // ...})->assert(track, trackd+);
  • 65. Restringiendo las variables de la ruta$app->get(/schedule/{track}, function ($track){ // ...})->assert(track, 1|2);
  • 66. Valores por defecto$app->get(/schedule/{track}, function ($track){ // ...})->value(track, 1);
  • 67. Valores por defecto$app->get(/schedule/{track}, function ($track){ // ...})->value(track, 1);/schedule/schedule/1
  • 68. Rutas con nombre$app->get(/, function () use ($app) { // ...})->bind(portada);
  • 69. Controladores
  • 70. Controlador básico$app->get(/donde-comer, function () use ($app) { return $app[twig]->render(comer.twig);})->bind(comer);
  • 71. Controlador típico$app->get(/, function () use ($app) { $ponentes = $app[ponentes]; return $app[twig]->render(portada.twig, array(ponentes => $ponentes) );})->bind(portada);
  • 72. Controlador típico$app->get(/, function () use ($app) { $ponentes = $app[ponentes]; return $app[twig]->render(portada.twig, array(ponentes => $ponentes) );})->bind(portada);
  • 73. Gestión de errores$app->get(/speakers/{slug}, function ($slug) use ($app) { if (...) { $app->abort(404, "No existe el ponente."); } // ... return $app[twig]->render(ponente.twig,...);})->bind(ponente);
  • 74. Gestión de errores$app->get(/speakers/{slug}, function ($slug) use ($app) { if (...) { $app->abort(404, "No existe el ponente."); } // ... return $app[twig]->render(ponente.twig,...);})->bind(ponente);
  • 75. Controlador especial para errores$app->error(function (Exception $e, $code) use ($app) { // ...});
  • 76. Controlador especial para errores$app->error(function (Exception $e, $code) use ($app) { // ...});
  • 77. Esqueleto de una aplicación Silex$app->get(/, ...)->bind(portada);$app->get(/agenda, ...)->bind(agenda);$app->get(/speakers/{slug}, ...)->bind(ponente);$app->get(/schedule/{slug}, ...)->bind(ponencia);
  • 78. 1 aplicación = 1 archivo$app->get(/, ...)->bind(portada);$app->get(/agenda, ...)->bind(agenda);$app->get(/speakers/{slug}, ...)->bind(ponente);$app->get(/schedule/{slug}, ...)->bind(ponencia); controllers.php
  • 79. 1 aplicación = 1 archivo EL ORDEN$app->get(/, ...)->bind(portada);$app->get(/agenda, ...)->bind(agenda); IMPORTA$app->get(/speakers/{slug}, ...)->bind(ponente);$app->get(/schedule/{slug}, ...)->bind(ponencia); controllers.php
  • 80. Middlewares (filtros)
  • 81. Petición HTTP Objeto Request Silex Tu aplicaciónPágina HTML Silex Objeto Response
  • 82. Petición HTTP Objeto Request ! Silex Tu aplicación ! !Página HTML Silex Objeto Response
  • 83. Filtro before$app->before(function (Request $request) { // ...});
  • 84. Secuencia de ejecución• Buscar la ruta que pide el usuario.• Comprobar la seguridad.• Ejecutar filtro before()• Ejecutar controlador de la ruta
  • 85. Ejemplo de filtro before$app->before(function (Request $request) { if (...) { return new RedirectResponse(/login); }});
  • 86. Filtro after$app->after(function (Request $request, Response $response) { // ...});
  • 87. Secuencia de ejecución• Buscar la ruta que pide el usuario.• Comprobar la seguridad.• Ejecutar filtro before( )• Ejecutar controlador de la ruta.• Ejecutar filtro after( )• Enviar respuesta al usuario.
  • 88. Ejemplo de filtro after$app->after(function (Request $request) { log(...);});
  • 89. Ejemplo de filtro after$app->after(function (Request $request) { log(...);}); ¿Dónde está mi respuesta?
  • 90. Filtro finish$app->finish(function (Request $request, Response $response) { // ...});
  • 91. Cada ruta con su filtro$app->get(/, ...)->bind(portada)->before(...);$app->get(/agenda, ...)->bind(agenda)->before(...)->after(...);$app->get(/speakers/{slug}, ...)->bind(ponente)->before(...);$app->get(/schedule/{slug}, ...)->bind(ponencia)->before(...);
  • 92. Proveedores de servicios
  • 93. Bases de datos FormulariosNúcleo Plantillasde Silex Caché HTTP Envío de emails proveedores
  • 94. Bases de datos FormulariosNúcleo Plantillasde Silex Caché HTTP Envío de emails proveedores
  • 95. Bases de datos FormulariosNúcleo Plantillasde Silex Caché HTTP Envío de emails proveedores
  • 96. Bases de datos FormulariosNúcleo Plantillasde Silex Caché HTTP Envío de emails
  • 97. Bases de datos Serializador SeguridadFormularios Logger SesionesValidación Emails PlantillasCaché HTTP URL
  • 98. Usar formularios de Symfony2use SilexProviderFormServiceProvider;// ...$app->register(new FormServiceProvider());
  • 99. Acceder a BBDD con Doctrine2use SilexProviderDoctrineServiceProvider;// ...$app->register(new DoctrineServiceProvider());
  • 100. Utilizar las plantillas de Twiguse SilexProviderTwigServiceProvider;// ...$app->register(new TwigServiceProvider(), array( twig.path => array(__DIR__./../templates), twig.options => array(...),));
  • 101. DEMO
  • 102. github.com/javiereguiluz/bilbostack ub G itH e on k m F or
  • 103. Instalación
  • 104. Descargar archivo comprimido silex.sensiolabs.org
  • 105. Descargar archivo comprimido
  • 106. Descargar archivo comprimido
  • 107. Descargar archivo comprimido
  • 108. Instalación via composer.json{ "require": { "silex/silex": "1.0.*" }, "minimum-stability": "dev"}
  • 109. Instalación via composer.json{ "require": { "fabpot/silex-skeleton": "*" }, "minimum-stability": "dev"}
  • 110. Instalación recomendada$ composer create-project fabpot/silex-skeleton --stability=dev
  • 111. web/ src/ src/index.php app.php controllers.php
  • 112. web/ src/ src/index.php app.php controllers.phpNo tocar
  • 113. web/ src/ src/index.php app.php controllers.phpNo tocar Activas servicios
  • 114. web/ src/ src/index.php app.php controllers.phpNo tocar Activas $app servicios ->get(/, ...});
  • 115. Buenasprácticas
  • 116. Organizandolos controladores
  • 117. $app->get(/, ...); // ... controllers.php$app->get(/, ...); $app->get(/, ...); blog.php backend.php
  • 118. Importando controladores$app->mount(/blog, include blog.php);$app->mount(/admin, include backend.php);
  • 119. Importando controladores$app->mount(/blog, include blog.php);$app->mount(/admin, include backend.php);
  • 120. Importando controladores$app->mount(/blog, include blog.php);$app->mount(/admin, include backend.php);PORTADA: /PORTADA DE BLOG: /blog/PORTADA DE BACKEND: /admin/
  • 121. 1 aplicación = 1 archivo$app->get(/, ...)->bind(portada);$app->get(/agenda, ...)->bind(agenda);$app->get(/speakers/{slug}, ...)->bind(ponente);$app->get(/schedule/{slug}, ...)->bind(ponencia); controllers.php
  • 122. 1 aplicación pequeña = 1 archivo$app->get(/, ...)->bind(portada);$app->get(/agenda, ...)->bind(agenda);$app->get(/speakers/{slug}, ...)->bind(ponente);$app->get(/schedule/{slug}, ...)->bind(ponencia); controllers.php
  • 123. 1 aplicación mediana = N archivos$app->get(/, ...)->bind(portada); $app->get(/, ...);$app->get(/agenda, ...)- $app->get(/ver, ...);>bind(agenda); $app->get(/listar, ...);$app->get(/speakers/{slug}, ...)->bind(ponente); blog.php$app->get(/schedule/{slug}, ...)->bind(ponencia); $app->get(/, ...); controllers.php backend.php
  • 124. Escalando unaaplicación Silex
  • 125. Controladores como clasesnamespace IgorwShopController;use SilexApplication;use SymfonyComponentHttpFoundationRequest;class ShopController{ public function indexAction(Request $request, Application $app) { ... }}
  • 126. Controladores como clases$app->get(/, controller(shop/index));$app->match(/login, controller(shop/login));$app->get(/product, controller(shop/product));
  • 127. http://igor.io/2012/11/09/scaling-silex.html
  • 128. Puntosdébiles
  • 129. i18n DepuraciónORM DocumentaciónESI
  • 130. i18n (internacionalización)• Fácil traducir contenidos {{ "Hola Mundo"|trans }}• No es cómodo traducir rutas y contenidos de la base de datos.
  • 131. ORM• No hay soporte oficial del ORM completo (Doctrine2).• No hay ORM alternativos ligeros.• Si tu aplicación necesita un ORM, puede ser demasiado grande para Silex.
  • 132. Depuración// activar el modo debug$app[debug] = true;// activar el loguse SilexProviderMonologServiceProvider;$app->register(new MonologServiceProvider(),array( monolog.logfile => __DIR__./../logs/dev.log,));
  • 133. Mensajes de error
  • 134. ESI• Silex incluye soporte de ESI.• Su uso es bastante incómodo (comparado con Symfony2).
  • 135. Documentación• Todas las características de Silex están documentadas.• No es tan abundante como la de Symfony2.
  • 136. Documentación• Oficial silex.sensiolabs.org/documentation• Traducción librosweb.es/silex
  • 137. Conclusiones
  • 138. Conclusiones• Silex es un microframework, pero no es un juguete.
  • 139. Conclusiones• Silex es un microframework, pero no es un juguete.• Silex sirve para cualquier aplicación web que no sea enorme.
  • 140. Conclusiones• Silex es un microframework, pero no es un juguete.• Silex sirve para cualquier aplicación web que no sea enorme.• Silex reduce a “horas” el tiempo de desarrollo de aplicaciones enteras.
  • 141. Conclusiones• Silex es un microframework, pero no es un juguete.• Silex sirve para cualquier aplicación web que no sea enorme.• Silex reduce a “horas” el tiempo de desarrollo de aplicaciones enteras.• Silex combina la agilidad de PHP con la profesionalidad de Symfony.
  • 142. GRACIAS.
  • 143. Contacto • javier.eguiluz@gmail.com • twitter.com/javiereguiluz • github.com/javiereguiluz • linkedin.com/in/javiereguiluzdomingo, 27 de enero de 13