SlideShare una empresa de Scribd logo
1 de 33
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
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!
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
(Macintosh)
Symfony 2 y fundamentos HTTP
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
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
$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
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
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
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 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
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
// 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
// src/Acme/DemoBundle/Controller/MainController.php
class MainController
{
public function contactAction()
{
return new Response('<h1>Contact us!</h1>');
}
}
Configuración Routing Controller
El Controlador
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 = 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);?>
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 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...
<?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
<!--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
<?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)
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)
<?php
// index.php
require_once 'model.php';
$posts = get_all_posts();
require 'templates/list.php';
Symfony 2 vs PHP Simple
El Controlador...
<!-- 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
<!-- 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
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
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';
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' ?>
Algunos problemas que persisten:
● Desinfectar el parámetro id, tratar en
consecuencia (redireccionamientos 404)
● Problema de loading de archivos.
Symfony 2 vs PHP Simple
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)
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>';
}
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';
}
La estructura final
Symfony 2 vs PHP Simple
-> blog
|-> templates
| |-> list.php
| |-> show.php
|-> controllers.php
|-> index.php
|-> model.php

Más contenido relacionado

La actualidad más candente

Api De Google Calendar
Api De Google CalendarApi De Google Calendar
Api De Google Calendar
jvelizster
 
Slides components en
Slides components enSlides components en
Slides components en
Javier López
 

La actualidad más candente (20)

Servicios web
Servicios webServicios web
Servicios web
 
Servicios web
Servicios webServicios web
Servicios web
 
Servicios web
Servicios webServicios web
Servicios web
 
4.Programación con PHP y MySQL
4.Programación con PHP y MySQL4.Programación con PHP y MySQL
4.Programación con PHP y MySQL
 
desarrolo de sitios web php y mysql
desarrolo de sitios web php y mysqldesarrolo de sitios web php y mysql
desarrolo de sitios web php y mysql
 
Curso php y_mysql
Curso php y_mysqlCurso php y_mysql
Curso php y_mysql
 
33 php
33 php33 php
33 php
 
Api De Google Calendar
Api De Google CalendarApi De Google Calendar
Api De Google Calendar
 
Materiales del curso de Symfony2
Materiales del curso de Symfony2Materiales del curso de Symfony2
Materiales del curso de Symfony2
 
RabbitMQ y Symfony
RabbitMQ y SymfonyRabbitMQ y Symfony
RabbitMQ y Symfony
 
Introducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGRIntroducción a PHP - Programador PHP - UGR
Introducción a PHP - Programador PHP - UGR
 
Php basico y avanzado
Php basico y avanzadoPhp basico y avanzado
Php basico y avanzado
 
Funciones
FuncionesFunciones
Funciones
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Curso php y_my_sql
Curso php y_my_sqlCurso php y_my_sql
Curso php y_my_sql
 
Slides components en
Slides components enSlides components en
Slides components en
 
Php y MySQL
Php y MySQLPhp y MySQL
Php y MySQL
 
Introducción a recaptcha 3.0
Introducción a recaptcha 3.0Introducción a recaptcha 3.0
Introducción a recaptcha 3.0
 
Manual php completo by_ desarrolloweb
Manual php completo by_ desarrollowebManual php completo by_ desarrolloweb
Manual php completo by_ desarrolloweb
 
Introducción a PHP
Introducción a PHPIntroducción a PHP
Introducción a PHP
 

Similar a Clase 2 conceptos fundamentales

PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdfPHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
Raaulroodriguez
 
Presentacion
PresentacionPresentacion
Presentacion
El Jota
 
Dce2 introduccion asp.net primeras 20
Dce2 introduccion asp.net primeras 20Dce2 introduccion asp.net primeras 20
Dce2 introduccion asp.net primeras 20
Marvin Romero
 
Informe grupal f_arinango_ cuenca
Informe grupal f_arinango_ cuencaInforme grupal f_arinango_ cuenca
Informe grupal f_arinango_ cuenca
paulcuenca9
 
Joomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensionesJoomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensiones
deivit86
 

Similar a Clase 2 conceptos fundamentales (20)

Introducción al framework Symfony
Introducción al framework SymfonyIntroducción al framework Symfony
Introducción al framework Symfony
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controller
 
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdfPHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf PHP.pdf
 
Presentacion
PresentacionPresentacion
Presentacion
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!
 
Dce2 introduccion asp.net primeras 20
Dce2 introduccion asp.net primeras 20Dce2 introduccion asp.net primeras 20
Dce2 introduccion asp.net primeras 20
 
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasosDesymfony 2011 - Tutorial #1: Instalacion y primeros pasos
Desymfony 2011 - Tutorial #1: Instalacion y primeros pasos
 
Curso Java Avanzado 2 Servlets
Curso Java Avanzado   2 ServletsCurso Java Avanzado   2 Servlets
Curso Java Avanzado 2 Servlets
 
Symfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y MigraciónSymfony parte 15 Consultas y Migración
Symfony parte 15 Consultas y Migración
 
Clase 10 formularios
Clase 10   formulariosClase 10   formularios
Clase 10 formularios
 
Esquemas de seguridad para el servidor
Esquemas de seguridad para el servidorEsquemas de seguridad para el servidor
Esquemas de seguridad para el servidor
 
APIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptxAPIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptx
 
Php!
Php!Php!
Php!
 
Informe grupal f_arinango_ cuenca
Informe grupal f_arinango_ cuencaInforme grupal f_arinango_ cuenca
Informe grupal f_arinango_ cuenca
 
EXAMEN
EXAMENEXAMEN
EXAMEN
 
Presentacion YII
Presentacion YIIPresentacion YII
Presentacion YII
 
PHP en el 2015
PHP en el 2015PHP en el 2015
PHP en el 2015
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
0139-php-y-mysql-lenguaje-php-basico.pdf
0139-php-y-mysql-lenguaje-php-basico.pdf0139-php-y-mysql-lenguaje-php-basico.pdf
0139-php-y-mysql-lenguaje-php-basico.pdf
 
Joomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensionesJoomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensiones
 

Más de hydras_cs (13)

Clase 15 FOS
Clase 15 FOSClase 15 FOS
Clase 15 FOS
 
Clase 15
Clase 15Clase 15
Clase 15
 
Clase 14 bundles útiles
Clase 14 bundles útilesClase 14 bundles útiles
Clase 14 bundles útiles
 
Clase 13 seguridad
Clase 13   seguridad Clase 13   seguridad
Clase 13 seguridad
 
Clase 11 continuamos con formularios
Clase 11   continuamos con formulariosClase 11   continuamos con formularios
Clase 11 continuamos con formularios
 
Clase 10 validacion
Clase 10   validacionClase 10   validacion
Clase 10 validacion
 
Clase 7 el modelo
Clase 7  el modeloClase 7  el modelo
Clase 7 el modelo
 
Clase 14 doctrine - subir archivos
Clase 14   doctrine - subir archivosClase 14   doctrine - subir archivos
Clase 14 doctrine - subir archivos
 
Clase 6 twig
Clase 6 twigClase 6 twig
Clase 6 twig
 
Clase 4 routing
Clase 4 routingClase 4 routing
Clase 4 routing
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasos
 
Sensio labsdesktop
Sensio labsdesktopSensio labsdesktop
Sensio labsdesktop
 
Clase 1 introducción a symfony 2
Clase 1   introducción a symfony 2Clase 1   introducción a symfony 2
Clase 1 introducción a symfony 2
 

Último

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 

Último (11)

Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 

Clase 2 conceptos fundamentales

  • 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. 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. Escenario: queremos ver unas tiras cómicas en xkcd... Symfony 2 y fundamentos HTTP
  • 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. 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. 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. $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. 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. 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. El flujo de las aplicaciones Symfony
  • 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. 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. // 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. // 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. Symfony 2 vs PHP Simple Un blog en php simple...
  • 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. Symfony 2 vs PHP Simple
  • 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. <?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. <!--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. <?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. 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. <?php // index.php require_once 'model.php'; $posts = get_all_posts(); require 'templates/list.php'; Symfony 2 vs PHP Simple El Controlador...
  • 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. <!-- 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. 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. 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. 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. 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. 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. 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. 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. La estructura final Symfony 2 vs PHP Simple -> blog |-> templates | |-> list.php | |-> show.php |-> controllers.php |-> index.php |-> model.php