silex: microframework y camino fácil de aprender symfony
DESCRIPTION
Ya quieres aprender Symfony? Bueno! Si eres en usuario de Drupal o si quieres aumentar sus habilidades, aprender Symfony puede ayudarte. Sin embargo, aprender Symfony puede ser difícil - y muchas ideas nuevas (pero buenas) como PHP namespaces, Composer, y código "object-oriented". Te presento a Silex: el Microframework que se construye por las mismos pedazos (HttpFoundation, HttpKernel, Composer, etc) como el Symfony Framework y Drupal 8. En esta charla, vamos a crear un mini-app con Silex para mostrarte como fácil puede ser y cuales partes son los mismos como Symfony y Drupal. Al fin, vas a estar listo entender Drupal 8 o crear su primer proyecto con Symfony. Y porque esta charla sería mi primera en español, puedas disfrutar esta aventura conmigo :).TRANSCRIPT
PHP Tutorial Screencasts
Silex
Microframework y camino fácil de aprender
Symfony
!
!
!
!
!!• Husband of the much more talented @leannapelham
PHP Tutorial Screencasts
knplabs.com github.com/weaverryan
• Lead contributor to the Symfony documentation !• KnpLabs US - Symfony consulting, training, Kumbaya !• Writer for KnpUniversity.com
screencasts
Buenos Dias!
PHP Tutorial Screencasts
knplabs.com github.com/weaverryan
• Viví en Querétaro en 2003 para cuatro meses
• Hablé casi 5 palabras en español.
• Este gringo estaba *sorprendido* por el costumbre de besar para saludar a las mujeres
Querétaro
Capítulo 1 !
La anatomía de cualquier web framework
@weaverryan
@weaverryan
Una aplicación compleja que nos
da saludos!
Configure Apache
O usen al web server nativo de PHP!
php -S localhost:8000
@weaverryan
*Se puede usar este web server para Drupal también
Request -> Response Framework
Request: GET /hello/drupalmx
Routing: determina una función que puede crear esta página (el controller)
El Controller: nuestro código: construye la pagina
Response: Hello drupalmx!@weaverryan
Una ruta que coincide cuando el URI es
/hello/*@weaverryan
Si el URI coincide la ruta, Silex ejecuta esta
función (el controller)
@weaverryan
El valor de {name} se pasa como argumento
al controller
@weaverryan
Construimos la pagina y celebrar!
@weaverryan
Request -> Response Framework
Request: GET /hello/drupalmx
Routing: determina una función que puede crear esta página (el controller)
El Controller: nuestro código: construye la pagina
Response: Hello drupalmx!@weaverryan
Capítulo 2 !
Request-Response
Nuestro Trabajo: Entender el “request” y
crear un “response”
@weaverryan
El Request
@weaverryan
GET /hello/drupalmx?page=5 HTTP/1.1!Host: localhost:8000!Connection: keep-alive!Cache-Control: max-age=0!Accept: text/html,application/xhtml+xml!User-Agent: Mozilla/5.0!Cookie: PHPSESSID=abcdefg; has_js=1;
El cliente nos da un mensaje sencillo que describe qué quiere
El Request
@weaverryan
GET /hello/drupalmx?page=5 HTTP/1.1!Host: localhost:8000!Connection: keep-alive!Cache-Control: max-age=0!Accept: text/html,application/xhtml+xml!User-Agent: Mozilla/5.0!Cookie: PHPSESSID=abcdefg; has_js=1;
El cliente nos da un mensaje sencillo que describe qué quiere
El método HTTP
El URI
El Request
@weaverryan
GET /hello/drupalmx?page=5 HTTP/1.1!Host: localhost:8000!Connection: keep-alive!Cache-Control: max-age=0!Accept: text/html,application/xhtml+xml!User-Agent: Mozilla/5.0!Cookie: PHPSESSID=abcdefg; has_js=1;
El cliente nos da un mensaje sencillo que describe qué quiere
Los Request headers
El Response
@weaverryan
HTTP/1.1 200 OK!Host: localhost:8000!Cache-Control: no-cache!Date: Wed, 23 Apr 2014 16:25:03 GMT!Content-Type: text/html;!!
Hello drupalmx
El Response
@weaverryan
El código del response
Los Response headersHTTP/1.1 200 OK!Host: localhost:8000!Cache-Control: no-cache!Date: Wed, 23 Apr 2014 16:25:03 GMT!Content-Type: text/html;!!
<h1>Hello drupalmx</h1>
El cuerpo
En PHP, el “request” mensaje se deconstruye
a los “superglobals”
@weaverryan
Para crear el response, usamos “header” y echo
content
@weaverryan
@weaverryan
El Request en Silex
@weaverryan
El Response en Silex
Capítulo 3 !
Namespaces & Autoloading
https://www.flickr.com/photos/chrisjeriko/8599248142
El controller puede ser cualquier función
Controller como método en clase
@weaverryan
Controller como método en clase
@weaverryan
PHP Namespaces
@weaverryan
Namespaces nos da nombres max largos nombre: Drupal\acme\Controller\DemoController
PHP Namespaces
@weaverryan
Autoloading
@weaverryan
No se necesita usar require/include si: !
A. El namespace es igualal directorio
!
B. La clase es igual alnombre de archivo (+.php)
Se llama PSR-0
Capítulo 4: !
Servicios y el “container”
Servicios: Objetos útiles
@weaverryan
El container: el objeto que contiene todos los servicios
@weaverryan
En Silex, Symfony y Drupal 8, existe un “container”.
!
Si lo tienes, puede usar los servicios (objetos útiles)
Podemos usar el servicio de Twig para render un template?
@weaverryan
El “container” in SilexEl servicio “twig”
Request -> Response Framework
Request: GET /hello/drupalmx
Routing: determina una función que puede crear esta página (el controller)
El Controller: nuestro código: construye la pagina
Response: Hello drupalmx!@weaverryan
Container (con servicios)
Capítulo 5: !
Eventos
https://www.flickr.com/photos/bmp_creep/8064779382
Como Drupal “hooks”, Silex tiene eventos
@weaverryan
Puede decir a Silex: “Por favor, cuando
ocurra el evento XXXXX, ejecute esa función”
@weaverryan
Request -> Response Framework
Request: GET /hello/drupalmx
Routing: determina una función que puede crear esta página (el controller)
El Controller: nuestro código: construye la pagina
Response: Hello drupalmx!@weaverryan
Container (con servicios)
Evento: kernel.request
Evento: kernel.controller
Eventos: kernel.view
kernel.response
@weaverryan
@weaverryan
Capítulo 6: !
El Profiler
https://www.flickr.com/photos/fukagawa/415772853
Silex (por Symfony) tiene un “profiler”
@weaverryan
@weaverryan
Contiene muchísimo información, incluyendo
el “timeline”
@weaverryan
@weaverryan
1) kernel.request evento
2) Routing
3) Ejecuta el controller
4) Nuestro “listener” en kernel.view
Capítulo 7: !
Todo lo mismo en Drupal 8
Cómo podemos crear esto en Drupal 8?
Gracias a mi amigo Jesus Olivas por ya tener blog
posts muy buenos
@jmolivas
jmolivas.com
http://bit.ly/d8-hello
@weaverryan
Tiene Drupal 8 un container con servicios?
@weaverryan
El Container
Donde se debe encuentra el container puede cambiar antes del fin de Drpual 8
@weaverryan
@weaverryan
Pero sí hay un container !
Y sí continue todos los objetos útiles (servicios) de
Drupal
Hay eventos como Silex?
@weaverryan
¡Sí! Existen los mismos eventos y más
1) Crear una clase “listener”
Se ejecuta al fin del request !
Añadimos JavaScript a cada pagina en el sitio
2) Añadir un nuevo servicio al container
@weaverryan
Ahora, el container tiene un servicio que se llama “acme.view_subscriber”
El event_subscriber tag dice al Drupal que este servicio quiere ser un “listener”
para algunos eventos
@weaverryan
Y existe el profiler?
@weaverryan
https://drupal.org/project/webprofiler
@weaverryan
https://drupal.org/project/webprofiler
@weaverryan
https://drupal.org/project/webprofiler
@weaverryan
https://drupal.org/project/webprofiler
@weaverryan
https://drupal.org/project/webprofiler
@weaverryan
https://drupal.org/project/webprofiler
Capítulo 8 !
!
, y
Temas Principales
• Request/Response !
• Routing/Controller !
• PHP Namespaces/Autoloading !
• Services/Container
• Events/Listeners
• Profiler
@weaverryan
Todos son iguales en Silex, Drupal y Symfony
Se puede usar Silex para aprender Drupal
Se puede usar Silex para aprender Symfony
Se puede usar Symfony para aprender Drupal
Al fin, tienen mas herramientas para cualquier problema
PHP Tutorial Screencasts
Ryan Weaver @weaverryan
¡Gracias!
@weaveryan @KnpUniversity