Silex, desarrollo web ágil y profesional con PHP

17,048 views
17,226 views

Published on

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
4 Comments
19 Likes
Statistics
Notes
  • 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...
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Javier, como siempre, tu presentación se sale! Gracias por compartir!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • ¡Genial! Por cierto, me gusta mucho tu definición de Silex: 'elegante, ágil y sencillo'.
       Reply 
    Are you sure you want to  Yes  No
    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
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
17,048
On SlideShare
0
From Embeds
0
Number of Embeds
9,646
Actions
Shares
0
Downloads
262
Comments
4
Likes
19
Embeds 0
No embeds

No notes for slide

Silex, desarrollo web ágil y profesional con PHP

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

×