Conceptos
Fundamentales
Realizada por:
Christian Aquino |@cj_aquino
Diego Ramirez |@thedarsideofit
Para: Hydras C&S |@hydr...
Symfony 2 y fundamentos HTTP
HTTP (Hyper Text Transfer Protocol) es un
conjunto de normas y pasos que permiten
comunicar d...
Escenario: queremos ver unas tiras cómicas en
xkcd...
Symfony 2 y fundamentos HTTP
Paso 1: el cliente envía una petición...
GET / HTTP/1.1
Host: xkcd.com
Accept: text/html
User-Agent: Mozilla/5.0
(Macintos...
Verbos HTTP más comunes
GET Recupera el recurso desde el
servidor
POST Crea un recurso en el servidor
PUT Actualiza el rec...
Paso 2: el servidor devuelve la respuesta...
HTTP/1.1 200 OK
Date: Sat, 02 Apr 2011 21:05:05 GMT
Server: lighttpd/1.4.19
C...
$uri = $_SERVER['REQUEST_URI'];
$foo = $_GET['foo'];
header('Content-type: text/html');
echo 'La URI solicitada es: '.$uri...
use SymfonyComponentHttpFoundationRequest ;
$request = Request::createFromGlobals ();
// la URI solicitada (p. ej. /sobre)...
use SymfonyComponentHttpFoundationResponse;
$response = new Response();
$response->setContent('<html><body><h1>Hello world...
El flujo de las aplicaciones Symfony
● Cada petición ejecuta un archivo controlador
frontal;
● El sistema de enrutado determina cual
función PHP se debe ejecut...
Configuración Routing Controller
# app/config/routing.yml
contact:
pattern: /contact
defaults: { _controller: AcmeDemoBund...
// app/config/routing.php
use SymfonyComponentRoutingRouteCollection;
use SymfonyComponentRoutingRoute;
$collection = new ...
// src/Acme/DemoBundle/Controller/MainController.php
class MainController
{
public function contactAction()
{
return new R...
Symfony 2 vs PHP Simple
Un blog en php simple...
<?php
// index.php
$link = mysql_connect('localhost', 'myuser', 'mypassword');
mysql_select_db ('blog_db', $link);
$result...
Symfony 2 vs PHP Simple
● No hay comprobación de errores: ¿Qué sucede si falla la conexión a la
base de datos?
● Deficiente organización: Si la ap...
<?php // index.php
$link = mysql_connect('localhost', 'myuser', 'mypassword');
mysql_select_db('blog_db', $link);
$result ...
<!--templates/list.php-->
<html>
<head>
<title>List of Posts</title>
</head>
<body>
<h1>List of Posts</h1>
<ul>
<?php fore...
<?php
// model.php
function open_database_connection()
{
$link = mysql_connect('localhost', 'myuser',
'mypassword');
mysql...
function get_all_posts()
{
$link = open_database_connection();
$result = mysql_query('SELECT id, title FROM post',
$link);...
<?php
// index.php
require_once 'model.php';
$posts = get_all_posts();
require 'templates/list.php';
Symfony 2 vs PHP Simp...
<!-- templates/layout.php -->
<!DOCTYPE html>
<html>
<head>
<title><?php echo $title ?></title>
</head>
<body>
<?php echo ...
<!-- templates/list.php -->
<?php $title = 'List of Posts' ?>
<?php ob_start() ?>
<h1>List of Posts</h1>
<ul>
<?php foreac...
Agreguemos otra sección que muestre el
detalle de un post (show)
// model.php
function get_post_by_id($id)
{
$link = open_...
Agregamos un nuevo controlador...
Symfony 2 vs PHP Simple
<?php
// show.php
require_once 'model.php';
$post = get_post_by_...
Agregamos una nueva plantilla
Symfony 2 vs PHP Simple
<?php // templates/show.php
$title = $post['title']
ob_start() ?>
<h...
Algunos problemas que persisten:
● Desinfectar el parámetro id, tratar en
consecuencia (redireccionamientos 404)
● Problem...
La solución, crear un controlador frontal...
Symfony 2 vs PHP Simple
Without a front controller
/index.php => Blog post li...
Symfony 2 vs PHP Simple
<?php // index.php
// load and initialize any global libraries
require_once 'model.php';
require_o...
El index.php y show.php pasan a ser
funciones...
Symfony 2 vs PHP Simple
// controllers.php
function list_action()
{
$post...
La estructura final
Symfony 2 vs PHP Simple
-> blog
|-> templates
| |-> list.php
| |-> show.php
|-> controllers.php
|-> in...
Upcoming SlideShare
Loading in …5
×

Clase 2 conceptos fundamentales

434 views
378 views

Published on

www.hydrascs.com

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
434
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Clase 2 conceptos fundamentales

  1. 1. Conceptos Fundamentales Realizada por: Christian Aquino |@cj_aquino Diego Ramirez |@thedarsideofit Para: Hydras C&S |@hydras_cs Basada en "The Book" de la documentación oficial de Symfony2
  2. 2. Symfony 2 y fundamentos HTTP HTTP (Hyper Text Transfer Protocol) es un conjunto de normas y pasos que permiten comunicar dos máquinas entre sí mediante texto. ¡Eso es todo!
  3. 3. Escenario: queremos ver unas tiras cómicas en xkcd... Symfony 2 y fundamentos HTTP
  4. 4. Paso 1: el cliente envía una petición... GET / HTTP/1.1 Host: xkcd.com Accept: text/html User-Agent: Mozilla/5.0 (Macintosh) Symfony 2 y fundamentos HTTP
  5. 5. Verbos HTTP más comunes GET Recupera el recurso desde el servidor POST Crea un recurso en el servidor PUT Actualiza el recurso en el servidor DELETE Elimina el recurso del servidor Symfony 2 y fundamentos HTTP
  6. 6. Paso 2: el servidor devuelve la respuesta... HTTP/1.1 200 OK Date: Sat, 02 Apr 2011 21:05:05 GMT Server: lighttpd/1.4.19 Content-Type: text/html <html> <!-- ... HTML para xkcd comic --> </html> Symfony 2 y fundamentos HTTP
  7. 7. $uri = $_SERVER['REQUEST_URI']; $foo = $_GET['foo']; header('Content-type: text/html'); echo 'La URI solicitada es: '.$uri; echo 'El valor del parámetro "foo" es: '.$foo; Respuesta Peticiones y Respuestas en PHP Symfony 2 y fundamentos HTTP HTTP/1.1 200 OK Date: Sat, 03 Apr 2011 02:14:33 GMT Server: Apache/2.2.17 (Unix) Content-Type: text/html La URI solicitada es: /testing?foo=symfony El valor del parámetro "foo" es: symfony
  8. 8. use SymfonyComponentHttpFoundationRequest ; $request = Request::createFromGlobals (); // la URI solicitada (p. ej. /sobre) menos algunos parámetros de la consulta $request->getPathInfo(); // recupera las variables GET y POST respectivamente $request->query->get('foo'); $request->request->get('bar', 'default value if bar does not exist' ); // recupera las variables de SERVER $request->server->get('HTTP_HOST'); // recupera una instancia del archivo subido identificado por foo $request->files->get('foo'); // recupera un valor de COOKIE $request->cookies->get('PHPSESSID'); // recupera una cabecera HTTP de la petición, normalizada, con índices en minúscula $request->headers->get('host'); $request->headers->get('content_type' ); $request->getMethod(); // GET, POST, PUT, DELETE, HEAD $request->getLanguages(); // un arreglo de idiomas aceptados por el cliente Symfony 2 y fundamentos HTTP Peticiones en Symfony
  9. 9. use SymfonyComponentHttpFoundationResponse; $response = new Response(); $response->setContent('<html><body><h1>Hello world! </h1></body></html>'); $response->setStatusCode(200); $response->headers->set('Content-Type', 'text/html'); //imprime las cabeceras HTTP seguidas por el contenido $response->send(); Symfony 2 y fundamentos HTTP Respuesta en Symfony
  10. 10. El flujo de las aplicaciones Symfony
  11. 11. ● Cada petición ejecuta un archivo controlador frontal; ● El sistema de enrutado determina cual función PHP se debe ejecutar en base a la información de la petición y la configuración de enrutado que creaste; ● La función PHP correcta se ejecuta, donde tu código crea y devuelve el objeto Respuesta adecuado. El flujo de las aplicaciones Symfony
  12. 12. Configuración Routing Controller # app/config/routing.yml contact: pattern: /contact defaults: { _controller: AcmeDemoBundle:Main: contact } YML <route id="contact" pattern="/contact"> <default key="_controller"> AcmeBlogBundle:Main:contact </default> </route> XML
  13. 13. // app/config/routing.php use SymfonyComponentRoutingRouteCollection; use SymfonyComponentRoutingRoute; $collection = new RouteCollection(); $collection->add('contact', new Route('/contact', array( '_controller' => 'AcmeBlogBundle:Main:contact', ))); return $collection; Configuración Routing Controller PHP
  14. 14. // src/Acme/DemoBundle/Controller/MainController.php class MainController { public function contactAction() { return new Response('<h1>Contact us!</h1>'); } } Configuración Routing Controller El Controlador
  15. 15. Symfony 2 vs PHP Simple Un blog en php simple...
  16. 16. <?php // index.php $link = mysql_connect('localhost', 'myuser', 'mypassword'); mysql_select_db ('blog_db', $link); $result = mysql_query('SELECT id, title FROM post' , $link); ?> <!DOCTYPE html> <html> <head> <title>List of Posts</title> </head> <body> <h1>List of Posts</h1> <ul> <?php while ($row = mysql_fetch_assoc ($result)): ?> <li> <a href="/show.php?id= <?php echo $row['id'] ?>"> <?php echo $row['title'] ?> </a> </li> <?php endwhile; ?> </ul> </body> </html> <?php mysql_close($link);?>
  17. 17. Symfony 2 vs PHP Simple
  18. 18. ● No hay comprobación de errores: ¿Qué sucede si falla la conexión a la base de datos? ● Deficiente organización: Si la aplicación crece, este único archivo cada vez será más difícil de mantener, hasta que finalmente sea imposible. ¿Dónde se debe colocar el código para manejar un formulario enviado? ¿Cómo se pueden validar los datos? ¿Dónde debe ir el código para enviar mensajes de correo electrónico? ● Es difícil reutilizar el código: Ya que todo está en un archivo, no hay manera de volver a utilizar alguna parte de la aplicación en otras «páginas» del blog. Symfony 2 vs PHP Simple Algunos problemas...
  19. 19. <?php // index.php $link = mysql_connect('localhost', 'myuser', 'mypassword'); mysql_select_db('blog_db', $link); $result = mysql_query('SELECT id, title FROM post', $link); $posts = array(); while ($row = mysql_fetch_assoc($result)) { $posts[] = $row; } mysql_close($link); // incluye el código HTML de la presentación require 'templates/list.php'; Symfony 2 vs PHP Simple Aislando la presentación
  20. 20. <!--templates/list.php--> <html> <head> <title>List of Posts</title> </head> <body> <h1>List of Posts</h1> <ul> <?php foreach ($posts as $post): ?> <li> <a href="/read?id=<?php echo $post['id'] ?>"> <?php echo $post['title'] ?> </a> </li> <?php endforeach; ?> </ul> </body> </html> Symfony 2 vs PHP Simple Aislando la presentación
  21. 21. <?php // model.php function open_database_connection() { $link = mysql_connect('localhost', 'myuser', 'mypassword'); mysql_select_db('blog_db', $link); return $link; } function close_database_connection($link) { mysql_close($link); } Symfony 2 vs PHP Simple Aislando la lógica de la aplicación (el dominio)
  22. 22. function get_all_posts() { $link = open_database_connection(); $result = mysql_query('SELECT id, title FROM post', $link); $posts = array(); while ($row = mysql_fetch_assoc($result)) { $posts[] = $row; } close_database_connection($link); return $posts; } Symfony 2 vs PHP Simple Aislando la lógica de la aplicación (el dominio)
  23. 23. <?php // index.php require_once 'model.php'; $posts = get_all_posts(); require 'templates/list.php'; Symfony 2 vs PHP Simple El Controlador...
  24. 24. <!-- templates/layout.php --> <!DOCTYPE html> <html> <head> <title><?php echo $title ?></title> </head> <body> <?php echo $content ?> </body> </html> Symfony 2 vs PHP Simple Aislamos el diseño
  25. 25. <!-- templates/list.php --> <?php $title = 'List of Posts' ?> <?php ob_start() ?> <h1>List of Posts</h1> <ul> <?php foreach ($posts as $post): ?> <li> <a href="/read?id=<?php echo $post['id'] ?>"> <?php echo $post['title'] ?> </a> </li> <?php endforeach; ?> </ul> <?php $content = ob_get_clean() ?> <?php include 'layout.php' ?> Para realizar esto necesitamos ob_start() ob_get_clean() Symfony provee el componente de Templating Symfony 2 vs PHP Simple Aislamos el diseño
  26. 26. Agreguemos otra sección que muestre el detalle de un post (show) // model.php function get_post_by_id($id) { $link = open_database_connection(); $id = intval($id); $query = 'SELECT date, title, body FROM post WHERE id = '.$id; $result = mysql_query($query); $row = mysql_fetch_assoc($result); close_database_connection($link); return $row; } Symfony 2 vs PHP Simple
  27. 27. Agregamos un nuevo controlador... Symfony 2 vs PHP Simple <?php // show.php require_once 'model.php'; $post = get_post_by_id($_GET['id']); require 'templates/show.php';
  28. 28. Agregamos una nueva plantilla Symfony 2 vs PHP Simple <?php // templates/show.php $title = $post['title'] ob_start() ?> <h1><?php echo $post['title'] ?></h1> <div class="date"><?php echo $post['date'] ?></div> <div class="body"> <?php echo $post['body'] ?> </div> <?php $content = ob_get_clean() ?> <?php include 'layout.php' ?>
  29. 29. Algunos problemas que persisten: ● Desinfectar el parámetro id, tratar en consecuencia (redireccionamientos 404) ● Problema de loading de archivos. Symfony 2 vs PHP Simple
  30. 30. La solución, crear un controlador frontal... Symfony 2 vs PHP Simple Without a front controller /index.php => Blog post list page (index.php executed) /show.php => Blog post show page (show.php executed) With index.php as the front controller /index.php => Blog post list page (index.php executed) /index.php/show => Blog post show page (index.php executed)
  31. 31. Symfony 2 vs PHP Simple <?php // index.php // load and initialize any global libraries require_once 'model.php'; require_once 'controllers.php'; // route the request internally $uri = $_SERVER['REQUEST_URI']; if ('/index.php' == $uri) { list_action(); } elseif ('/index.php/show' == $uri && isset($_GET['id'])) { show_action($_GET['id']); } else { header('Status: 404 Not Found'); echo '<html><body><h1>Page Not Found</h1></body></html>'; }
  32. 32. El index.php y show.php pasan a ser funciones... Symfony 2 vs PHP Simple // controllers.php function list_action() { $posts = get_all_posts(); require 'templates/list.php'; } function show_action($id) { $post = get_post_by_id($id); require 'templates/show.php'; }
  33. 33. La estructura final Symfony 2 vs PHP Simple -> blog |-> templates | |-> list.php | |-> show.php |-> controllers.php |-> index.php |-> model.php

×