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

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

Introducción al framework Symfony
Introducción al framework SymfonyIntroducción al framework Symfony
Introducción al framework SymfonyAlejandro Hernández
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controllerhydras_cs
 
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.pdfRaaulroodriguez
 
Presentacion
PresentacionPresentacion
PresentacionEl Jota
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Ricard Luquero
 
Dce2 introduccion asp.net primeras 20
Dce2 introduccion asp.net primeras 20Dce2 introduccion asp.net primeras 20
Dce2 introduccion asp.net primeras 20Marvin Romero
 
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 pasosJavier Eguiluz
 
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ónRodrigo Miranda
 
Clase 10 formularios
Clase 10   formulariosClase 10   formularios
Clase 10 formularioshydras_cs
 
Informe grupal f_arinango_ cuenca
Informe grupal f_arinango_ cuencaInforme grupal f_arinango_ cuenca
Informe grupal f_arinango_ cuencapaulcuenca9
 
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.pdfmiguelalemangonzales1
 
Joomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensionesJoomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensionesdeivit86
 

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

Clase 15 FOS
Clase 15 FOSClase 15 FOS
Clase 15 FOShydras_cs
 
Clase 14 bundles útiles
Clase 14 bundles útilesClase 14 bundles útiles
Clase 14 bundles útileshydras_cs
 
Clase 13 seguridad
Clase 13   seguridad Clase 13   seguridad
Clase 13 seguridad hydras_cs
 
Clase 11 continuamos con formularios
Clase 11   continuamos con formulariosClase 11   continuamos con formularios
Clase 11 continuamos con formularioshydras_cs
 
Clase 10 validacion
Clase 10   validacionClase 10   validacion
Clase 10 validacionhydras_cs
 
Clase 7 el modelo
Clase 7  el modeloClase 7  el modelo
Clase 7 el modelohydras_cs
 
Clase 14 doctrine - subir archivos
Clase 14   doctrine - subir archivosClase 14   doctrine - subir archivos
Clase 14 doctrine - subir archivoshydras_cs
 
Clase 6 twig
Clase 6 twigClase 6 twig
Clase 6 twighydras_cs
 
Clase 4 routing
Clase 4 routingClase 4 routing
Clase 4 routinghydras_cs
 
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 pasoshydras_cs
 
Sensio labsdesktop
Sensio labsdesktopSensio labsdesktop
Sensio labsdesktophydras_cs
 
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 2hydras_cs
 

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

LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxAlexander López
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxAlexander López
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1ivanapaterninar
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxGESTECPERUSAC
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesEdomar AR
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúCEFERINO DELGADO FLORES
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx241523733
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx241522327
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfjeondanny1997
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificialcynserafini89
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersIván López Martín
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerenciacubillannoly
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfedepmariaperez
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfKarinaCambero3
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOnarvaezisabella21
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosAlbanyMartinez7
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxtjcesar1
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzzAlexandergo5
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdfsharitcalderon04
 

Último (20)

LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptxLAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
LAS_TIC_COMO_HERRAMIENTAS_EN_LA_INVESTIGACIÓN.pptx
 
El camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVPEl camino a convertirse en Microsoft MVP
El camino a convertirse en Microsoft MVP
 
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptxEl_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
El_Blog_como_herramienta_de_publicacion_y_consulta_de_investigacion.pptx
 
Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1Guía de Registro slideshare paso a paso 1
Guía de Registro slideshare paso a paso 1
 
Tecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptxTecnologias Starlink para el mundo tec.pptx
Tecnologias Starlink para el mundo tec.pptx
 
Los Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, AplicacionesLos Microcontroladores PIC, Aplicaciones
Los Microcontroladores PIC, Aplicaciones
 
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del PerúRed Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
Red Dorsal Nacional de Fibra Óptica y Redes Regionales del Perú
 
GonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptxGonzalezGonzalez_Karina_M1S3AI6... .pptx
GonzalezGonzalez_Karina_M1S3AI6... .pptx
 
FloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptxFloresMorales_Montserrath_M1S3AI6 (1).pptx
FloresMorales_Montserrath_M1S3AI6 (1).pptx
 
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdfLa Electricidad Y La Electrónica Trabajo Tecnología.pdf
La Electricidad Y La Electrónica Trabajo Tecnología.pdf
 
Presentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia ArtificialPresentación sobre la Inteligencia Artificial
Presentación sobre la Inteligencia Artificial
 
CommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 TestcontainersCommitConf 2024 - Spring Boot <3 Testcontainers
CommitConf 2024 - Spring Boot <3 Testcontainers
 
Slideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan GerenciaSlideshare y Scribd - Noli Cubillan Gerencia
Slideshare y Scribd - Noli Cubillan Gerencia
 
Trabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdfTrabajo de tecnología excel avanzado.pdf
Trabajo de tecnología excel avanzado.pdf
 
Herramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdfHerramientas que posibilitan la información y la investigación.pdf
Herramientas que posibilitan la información y la investigación.pdf
 
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPOAREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
AREA TECNOLOGIA E INFORMATICA TRABAJO EN EQUIPO
 
Documentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos JuridicosDocumentacion Electrónica en Actos Juridicos
Documentacion Electrónica en Actos Juridicos
 
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptxModelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
Modelo de Presentacion Feria Robotica Educativa 2024 - Versión3.pptx
 
tarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzztarea de exposicion de senati zzzzzzzzzz
tarea de exposicion de senati zzzzzzzzzz
 
Análisis de Artefactos Tecnologicos (3) (1).pdf
Análisis de Artefactos Tecnologicos  (3) (1).pdfAnálisis de Artefactos Tecnologicos  (3) (1).pdf
Análisis de Artefactos Tecnologicos (3) (1).pdf
 

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