Libro Symfony2.4
-
Upload
daniel-andres-jimenez-hernandez -
Category
Documents
-
view
212 -
download
0
Transcript of Libro Symfony2.4
-
8/11/2019 Libro Symfony2.4
1/102
Captulo 1.Symfony2 y los fundamentos deHTTPEnhorabuena! Aprender a programar con Symfony2es una de las mejores formas
de convertirse en un programador web ms productivo, completo y popular(bueno, esto ltimo en realidad depende de t). Symfony2 est diseado para
volver a lo bsico: herramientas de desarrollo que te permiten programar ms
rpido y construir aplicaciones ms robustas, y que afectan lo mnimo a tu forma
de trabajar.
Symfony est basado en las mejores ideas de muchas tecnologas: las
herramientas y conceptos que ests a punto de aprender representan el esfuerzo
de miles de personas, durante muchos aos. En otras palabras, no ests
aprendiendo "Symfony", ests aprendiendo los fundamentos de la web, buenasprcticas de desarrollo, y cmo utilizar algunas de las mejores libreras PHP
publicadas recientemente. Por lo tanto, preprate!
Fiel a la filosofa Symfony2, este captulo comienza explicando el concepto
fundamental comn para el desarrollo web: HTTP. No importa cul sea tu
experiencia previa o cules sean tus lenguajes de programacin favoritos, este
captulo es una lectura obligadapara todo el mundo.
1.1.HTTP es simpleHTTP ("HyperText Transfer Protocol") es un lenguaje basado en texto que permite
a dos mquinas comunicarse entre s. Eso es todo! La siguiente conversacines
la que por ejemplo tiene lugar cuando quieres acceder a la ltima tira cmica
publicada por el sitioxkcd:
http://xkcd.com/http://xkcd.com/http://xkcd.com/http://xkcd.com/ -
8/11/2019 Libro Symfony2.4
2/102
Figura 1.1Flujo HTTP para obtener la tira cmica ms reciente de Xkcd
Y aunque el lenguaje realmente utilizado es un poco ms formal, sigue siendo
bastante simple.
HTTP es el trmino utilizado para describir este lenguaje simple basado en texto.
Y no importa cmo desarrolles en la web, el objetivo de tu servidor siempre es
entender las peticiones de texto simple, y devolver respuestas en texto simple.
Symfony2 est diseado en base a esa realidad. Aunque a veces no te des
cuenta, HTTP es algo que usas todos los das. Con Symfony2, aprenders a
dominarlo.
1.1.1. Paso 1: El cliente enva una peticin
Todas las conversaciones en la web comienzan con una peticin. La peticin es
un mensaje de texto creado por un cliente (por ejemplo un navegador, una
aplicacin para el iPhone, etc.) en un formato especial conocido como HTTP. El
cliente enva la peticin a un servidor, y luego espera la respuesta.
Echa un vistazo a la primera parte de la interaccin (la peticin) entre unnavegador y el servidor web del sitio xkcd:
-
8/11/2019 Libro Symfony2.4
3/102
Figura 1.2Peticin HTTP para obtener la tira cmica ms reciente de Xkcd
Utilizando el lenguaje HTTP, esta peticin en realidad sera algo parecido a lo
siguiente:
GET / HTTP/1.1
Host: xkcd.com
Accept: text/html
User-Agent: Mozilla/5.0 (Macintosh)
Este sencillo mensaje comunica todo lo necesario sobre qu recursos
exactamente solicita el cliente. La primera lnea de una peticin HTTP es la ms
importante y contiene dos cosas: la URI y el mtodo HTTP.
La URI (por ejemplo, /, /contacto, etc.) es la direccin o ubicacin que identifica
unvocamente al recurso que solicita el cliente. El mtodo HTTP (por ejemplo, GET)
define lo que quieres hacer con el recurso. Los mtodos HTTP son los verbosde
la peticin y definen las pocas formas en que puedes actuar sobre el recurso:
Mtodo Accin
GET Recupera el recurso desde el servidor
POST Crea un recurso en el servidor
-
8/11/2019 Libro Symfony2.4
4/102
Mtodo Accin
PUT Actualiza el recurso en el servidor
DELETE Elimina el recurso del servidor
Teniendo esto en cuenta, puedes imaginar cmo sera por ejemplo la peticin
HTTP necesaria para borar un artculo especfico de un blog:
DELETE /blog/15 HTTP/1.1
NOTAEn realidad, hay nueve mtodos HTTP definidos por la especificacin HTTP,pero muchos de ellos no se utilizan o no estn soportados. De hecho, muchos
navegadores modernos no soportan los mtodos PUTy DELETE.
Adems de la primera lnea, una peticin HTTP contiene tambin otras lneas de
informacin conocidas como cabeceras de peticin. Las cabeceras proporcionan
mucha informacin, como el servidor (o host) solicitado, los formatos de respuesta
que acepta el cliente (Accept) y la aplicacin que utiliza el cliente para realizar la
peticin (User-Agent). Existen muchas otras cabeceras y se pueden encontrar en
el artculoLista de campos de las cabeceras HTTPen la Wikipedia.
1.1.2. Paso 2: El servidor devuelve una respuesta
Una vez que un servidor ha recibido la peticin, sabe exactamente qu recursos
necesita el cliente (a travs de la URI) y lo que el cliente quiere hacer con ese
recurso (a travs del mtodo). Por ejemplo, en el caso de una peticin GET, el
servidor prepara el recurso y lo devuelve en una respuesta HTTP. Considera la
respuesta del servidor web del sitio xkcd:
http://en.wikipedia.org/wiki/List_of_HTTP_header_fieldshttp://en.wikipedia.org/wiki/List_of_HTTP_header_fieldshttp://en.wikipedia.org/wiki/List_of_HTTP_header_fieldshttp://en.wikipedia.org/wiki/List_of_HTTP_header_fields -
8/11/2019 Libro Symfony2.4
5/102
Figura 1.3Respuesta HTTP para obtener la tira cmica ms reciente de Xkcd
Traducida a HTTP, la respuesta enviada de vuelta al navegador es similar a lo
siguiente:
HTTP/1.1 200 OK
Date: Sat, 02 Apr 2011 21:05:05 GMT
Server: lighttpd/1.4.19
Content-Type: text/html
La respuesta HTTP contiene el recurso solicitado (en este caso, el contenido
HTML de una pgina web), as como otra informacin acerca de la respuesta. La
primera lnea es especialmente importante y contiene el cdigo de estado HTTP
(200en este caso) de la respuesta. El cdigo de estado indica el resultado globalde la peticin devuelta al cliente. Tuvo xito la peticin? Hubo algn error?
Existen diferentes cdigos de estado que indican xito, error o qu ms se
necesita hacer con el cliente (por ejemplo, redirigirlo a otra pgina). La lista
completa se puede encontrar en el artculoLista de cdigos de estado HTTPen la
Wikipedia.
http://es.wikipedia.org/wiki/Anexo:C%C3%B3digos_de_estado_HTTPhttp://es.wikipedia.org/wiki/Anexo:C%C3%B3digos_de_estado_HTTPhttp://es.wikipedia.org/wiki/Anexo:C%C3%B3digos_de_estado_HTTPhttp://es.wikipedia.org/wiki/Anexo:C%C3%B3digos_de_estado_HTTP -
8/11/2019 Libro Symfony2.4
6/102
Al igual que la peticin, una respuesta HTTP contiene datos adicionales conocidos
como cabeceras HTTP. Por ejemplo, una cabecera importante de la respuesta
HTTP es Content-Type. Un mismo recurso se puede devolver en varios formatos
diferentes (HTML, XML, JSON, etc.) y la cabeceraContent-Typedice al cliente qu
formato se ha utilizado (para ello utiliza valores estndar comotext/htmlque seconocen como Internet Media Types). Puedes encontrar la lista completa de tipos
de contenido en el artculoLista de tipos de contenido de Interneten la Wikipedia.
Existen muchas otras cabeceras, algunas de las cuales son muy importantes. Por
ejemplo, ciertas cabeceras se pueden usar para crear un sistema de memoria
cach bastante interesante.
1.1.3. Peticiones, respuestas y desarrollo web
Esta conversacin peticin-respuesta es el proceso fundamental en el que se basa
toda la comunicacin en la web. Y a pesar de ser tan importante y poderoso, al
mismo tiempo es muy sencillo.
El concepto ms importante es el siguiente: independientemente del lenguaje que
utilices, el tipo de aplicacin que construyas (web, mvil, API), o la filosofa de
desarrollo que sigas, el objetivo final de una aplicacin siempre es entender cada
peticin y crear y devolver la respuesta adecuada.
Symfony est diseado para adaptarse a esta realidad.
TRUCOPuedes obtener ms informacin acerca de la especificacin HTTP, en la
referencia originalHTTP 1.1 RFC.Tambin puedes leer la referenciaHTTP Bis,
que es una versin actualizada y ms detallada de la referencia anterior. Una gran
herramienta para comprobar tanto la peticin como las cabeceras de la respuesta
mientras navegas es la extensinLive HTTP Headersde Firefox o elInspector
Webde los navegadores Chrome y Safari.
1.2.Peticiones y respuestas en PHPCmo interactas con la "peticin" y creas una "respuesta" utilizando PHP? En
realidad, PHP te abstrae un poco de todo el proceso:
-
8/11/2019 Libro Symfony2.4
7/102
$foo=$_GET['foo'];
header('Content-type: text/html');
echo'La URI solicitada es: '.$uri;
echo'El valor del parmetro "foo" es: '.$foo;
Por extrao que parezca, esta pequea aplicacin est obteniendo informacin de
la peticin HTTP y la utiliza para crear una respuesta HTTP. En lugar de analizar
el mensaje HTTP de la peticin, PHP crea variables
superglobalescomo $_SERVERy $_GETque contienen toda la informacin de la
peticin. Del mismo modo, en lugar de devolver la respuesta HTTP con formato de
texto, puedes usar la funcin header()para crear las cabeceras de la respuesta y
simplemente imprimir el contenido que se enviar en el mensaje de la respuesta.Despus PHP crea la verdadera respuesta HTTP que se devuelve al cliente:
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 parmetro "foo" es: symfony
1.3.Peticiones y respuestas en SymfonySymfony ofrece una alternativa al enfoque de PHP a travs de dos clases que te
permiten interactuar con la peticin HTTP y la respuesta de una manera ms fcil.
La clase Requestrepresenta la peticin HTTP siguiendo la filosofa de orientacin
a objetos. Con ella, tienes toda la informacin a tu alcance:
useSymfony\Component\HttpFoundation\Request;
$request=Request::createFromGlobals();
-
8/11/2019 Libro Symfony2.4
8/102
// la URI solicitada (p.e. /contacto) menos algunos parmetros de la consulta
$request->getPathInfo();
// recupera las variables GET y POST respectivamente
$request->query->get('foo');
$request->request->get('bar','valor utilizado si "bar" no existe');
// 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 una COOKIE
$request->cookies->get('PHPSESSID');
// recupera una cabecera HTTP de la peticin, normalizada, con ndices en minscula
$request->headers->get('host');
$request->headers->get('content_type');
$request->getMethod(); // GET, POST, PUT, DELETE, HEAD
$request->getLanguages(); // un array de idiomas aceptados por el cliente
Una ventaja aadida es que la clase Requesthace un montn de trabajo adicional
del que no tienes que preocuparte. Por ejemplo, el
mtodo isSecure()internamente comprueba tres valores PHP diferentes que
pueden indicar si el usuario est conectado a travs de una conexin segura (es
decir,https).
-
8/11/2019 Libro Symfony2.4
9/102
ParameterBagsy atributos de la peticinComo vimos anteriormente, lasvariables $_GETy $_POSTson accesibles a travs de las
propiedadesqueryy requestde la clase Request, respectivamente. Cada uno de
estos objetos es un objeto de la clase ParameterBag, la cual cuenta con mtodos
cmo get(), has()y all()entre otros.De hecho, todas las propiedades pblicas utilizadas en el cdigo del ejemplo
anterior son un ejemplo del ParameterBag.
La clase Requesttambin tiene una propiedad pblica attributes, que almacena
informacin especial relacionada sobre el funcionamiento interno de la aplicacin.
En Symfony2, la propiedadattibutesguarda por ejemplo los valores relacionados
con el sistema de enrutamiento que se explicar ms adelante (como por
ejemplo, _controllery _route). El propsito de la propiedadattributeses el de
preparar y almacenar informacin del contexto especfico de la peticin.
Symfony tambin proporciona una clase Response, que simplifica la representacin
de la respuesta HTTP en PHP. Esto permite que tu aplicacin utilice una interfaz
orientada a objetos para construir la respuesta que ser devuelta al cliente:
useSymfony\Component\HttpFoundation\Response;
$response=newResponse();
$response->setContent('Hello world!');
$response->setStatusCode(Response::HTTP_OK);
$response->headers->set('Content-Type','text/html');
// imprime las cabeceras HTTP seguidas por el contenido
$response->send();
NOTALas constantes que definen los cdigos de estado de HTTP (como por
ejemploResponse::HTTP_OK) fueron aadidas en la versin 2.4 de Symfony.
Si Symfony no ofreciera nada ms, ya tendras un conjunto de herramientas para
acceder fcilmente a la informacin de la peticin y una interfaz orientada a
-
8/11/2019 Libro Symfony2.4
10/102
objetos para crear la respuesta. De hecho, a medida que aprendas muchas de las
caractersticas avanzadas de Symfony, nunca debes olvidar que el objetivo de tu
aplicacin es interpretar una peticin y crear la respuesta adecuada basada en la
lgica de tu aplicacin.
TRUCOLas clases Requesty Responseforman parte de un componente
independiente incluido en Symfony llamado HttpFoundation. Este componente se
puede utilizar en aplicaciones independientes de Symfony y tambin proporciona
clases para manejar sesiones y subir archivos.
1.4.El viaje desde la peticin hasta larespuestaAl igual que el mismo HTTP, los objetos Peticiny Responseson bastante simples.
La parte difcil de la construccin de una aplicacin es escribir lo que viene en el
medio.
En otras palabras, el verdadero trabajo viene al escribir el cdigo que interpreta la
informacin de la peticin y crea la respuesta.
Tu aplicacin probablemente hace muchas cosas, como enviar correo electrnico,
manejar los formularios presentados, guardar cosas en una base de datos,
reproducir las pginas HTML y proteger el contenido con seguridad. Cmo
puedes manejar todo esto y al mismo tiempo conseguir que tu cdigo est
organizado y sea fcil de mantener?
Symfony fue creado precisamente para resolver estos problemas y para que no
tengas que hacerlo a mano.
1.4.1. El controlador frontal
Antiguamente, las aplicaciones web se construan de modo que cada pgina web
del sitio tena su propio archivo fsico:index.php
contacto.php
blog.php
-
8/11/2019 Libro Symfony2.4
11/102
Esta filosofa de trabajo tiene varios problemas, como la falta de flexibilidad de
las URL(qu pasa si quieres cambiar blog.phpa noticias.phpsin romper todos
tus enlaces?) y el hecho de que cada archivo debe incluir a mano todos los
archivos necesarios para la seguridad, conexiones a base de datos y para aplicar
los estilos grficos del sitio.
Una solucin mucho mejor es usar un controlador frontal, que es un solo archivo
PHP que se encarga de servir todas las peticiones que llegan a tu aplicacin. Por
ejemplo:
Archivo solicitado Archivo realmente ejecutado
/index.php index.php
/index.php/contacto index.php
/index.php/blog index.php
TRUCOUsando el mdulo mod_rewritedeApache(o el equivalente en otros
servidores web), lasURLse pueden limpiarfcilmente para que quiten la parte
del index.phpy se queden simplemente en /, /contactoy /blog.
Ahora, todas las peticiones se manejan exactamente igual. En lugar de URL
individuales ejecutando diferentes archivos PHP, el controlador frontal siempre se
ejecuta, y la redireccin de cada URL a una parte diferente de la aplicacin se
realiza internamente. Esto resuelve los problemas comentados anteriormente.
Casi todas las aplicaciones web modernas siguen la filosofa del controlador
frontal, incluyendo aplicaciones como WordPress.
1.4.2. Mantente organizado
Una vez dentro del controlador frontal, cmo sabes qu pgina debes generar y
cmo puedes generar todas las pginas sin que la aplicacin se vuelva catica? El
truco consiste en comprobar la URI entrante y ejecutar diferentes partes de tu
-
8/11/2019 Libro Symfony2.4
12/102
cdigo en funcin de ese valor. Aunque es bastantechapucero, el siguiente cdigo
te podra servir para ello:
// Contenido del archivo index.php
useSymfony\Component\HttpFoundation\Request;
useSymfony\Component\HttpFoundation\Response;
$request=Request::createFromGlobals();
$path=$request->getPathInfo();// La ruta URI solicitada
if(in_array($path,array('','/')){
$response=newResponse('Bienvenido a nuestra portada.');
}elseif($path=='/contacto'){
$response=newResponse('Contctanos');
}else{
$response=newResponse('Pgina no encontrada.',Response::HTTP_NOT_FOUND);
}
$response->send();
Escalar el cdigo anterior para una aplicacin real es un problema difcil de
resolver. Afortunadamente esto es exactamente para lo que Symfony est
diseado.
1.4.3. El flujo de las aplicaciones Symfony
Cuando dejas que Symfony controle cada peticin, tu vida como programador es
mucho ms fcil. Symfony sigue el mismo patrn simple en cada peticin. Las
peticiones entrantes son interpretadas por el enrutador y pasadas a las funciones
controladoras, que devuelven objetos Response.
-
8/11/2019 Libro Symfony2.4
13/102
Figura 1.4Flujo de la peticin en Symfony2
Cada pgina de tu sitio est definida en un archivo de configuracin de rutas que
asigna a cada URL una funcin PHP diferente. El trabajo de cada funcin PHP
(conocida como controlador), es utilizar la informacin de la peticin junto con
muchas otras herramientas que Symfony pone a tu disposicin para crear y
devolver un objeto Response. En otras palabras, el controlador es donde est tu
cdigo: ah es dnde se interpreta la peticin y se crea una respuesta. As de
fcil!
Repasemos:
Cada peticin ejecuta un archivo controlador frontal;
El sistema de enrutado determina qu funcin PHP se ejecuta en base a la
informacin de la peticin y la configuracin de enrutado que hemos creado;
Se ejecuta la funcin PHP adecuada, donde tu cdigo crea y devuelve el
objeto Response.
1.4.4. Una peticin Symfony en la prctica
Sin entrar demasiado en los detalles, veamos este proceso en la prctica.
Supongamos que deseas agregar una pgina /contactoa tu aplicacin Symfony.
En primer lugar, empezamos agregando una entrada /contactoa tu archivo de
configuracin de rutas:
-
8/11/2019 Libro Symfony2.4
14/102
YAML
XML
PHP# app/config/routing.yml
contacto:
path: /contacto
defaults: {_controller: AcmeDemoBundle:Main:contacto }
NOTAEn este ejemplo utilizamos YAMLpara definir la configuracin de enrutado,
pero tambin se pueden utilizar los formatos XML y PHP.
Cuando alguien visita la pgina /contacto, Symfony2 detecta que se trata de esta
ruta y se ejecuta el controlador especificado. Como veremos en el captulo deenrutamiento, la cadenaAcmeDemoBundle:Main:contacto es un atajo que apunta al
mtodo contactoAction()de PHP dentro de una clase llamada MainController:
// src/Acme/DemoBundle/Controller/MainController.php
namespaceAcme\DemoBundle\Controller;
useSymfony\Component\HttpFoundation\Response;
classMainController
{
publicfunctioncontactoAction()
{
returnnewResponse('Contctanos');
}
}
En este ejemplo sencillo, el controlador simplemente crea un objeto Responsecon
el cdigo HTML "Contctanos" . En el captulo dedicado a los
controladores aprenders cmo hacer que los controladores utilicen plantillas para
generar el contenido HTML en vez de tener que escribirlo directamente en el
http://librosweb.es/symfony_2_4/capitulo_1/el_viaje_desde_la_peticion_hasta_la_respuesta.html#select_tab_1_a3857http://librosweb.es/symfony_2_4/capitulo_1/el_viaje_desde_la_peticion_hasta_la_respuesta.html#select_tab_1_a3857http://librosweb.es/symfony_2_4/capitulo_1/el_viaje_desde_la_peticion_hasta_la_respuesta.html#select_tab_2_a3857http://librosweb.es/symfony_2_4/capitulo_1/el_viaje_desde_la_peticion_hasta_la_respuesta.html#select_tab_2_a3857http://librosweb.es/symfony_2_4/capitulo_1/el_viaje_desde_la_peticion_hasta_la_respuesta.html#select_tab_3_a3857http://librosweb.es/symfony_2_4/capitulo_1/el_viaje_desde_la_peticion_hasta_la_respuesta.html#select_tab_3_a3857http://librosweb.es/symfony_2_4/capitulo_1/el_viaje_desde_la_peticion_hasta_la_respuesta.html#select_tab_3_a3857http://librosweb.es/symfony_2_4/capitulo_1/el_viaje_desde_la_peticion_hasta_la_respuesta.html#select_tab_2_a3857http://librosweb.es/symfony_2_4/capitulo_1/el_viaje_desde_la_peticion_hasta_la_respuesta.html#select_tab_1_a3857 -
8/11/2019 Libro Symfony2.4
15/102
objeto Response. Esto hace que el controlador deba preocuparse slo de las cosas
difciles: la interaccin con la base de datos, la manipulacin de la informacin o el
envo de mensajes de correo electrnico.
1.5.Symfony2: construye tu aplicacin, no tusherramientasAhora sabemos que el objetivo de cualquier aplicacin es interpretar cada peticin
entrante y crear una respuesta adecuada. Cuando una aplicacin crece, es ms
difcil organizar tu cdigo y que a la vez sea fcil de mantener. Adems, siempre te
vas a encontrar con las mismas tareas complejas: la persistencia de informacin a
la base de datos, procesar y reutilizar plantillas, manejar los formularios, enviar
mensajes de correo electrnico, validar los datos del usuario, administrar la
seguridad del sitio web, etc.
La buena noticia es que todos los programadores web se encuentran con esos
mismos problemas. As que Symfony proporciona una plataforma completa, con
herramientas que te permiten construir tu aplicacin, no tus herramientas. Con
Symfony2, nada se te impone: eres libre de usar la plataforma Symfony completa,
o simplemente aquellas partes de Symfony que quieras.
1.5.1. Herramientas independientes: los componentes de Symfony2
Con todo lo anterior, qu es exactamente Symfony2?. En primer lugar, Symfony2
es una coleccin de ms de veinte libreras independientes que se pueden utilizar
dentro de cualquier proyecto PHP. Estas libreras, llamadas componentes de
Symfony2, son bastante tiles prticamente para cualquier aplicacin,
independientemente de cmo desarrolles tu proyecto. Las siguientes son algunas
de las ms destacadas:
HttpFoundation: contiene las clases Requesty Response, as como otras clases
para manejar sesiones y cargar archivos.
Routing: potente y rpido sistema de enrutado que te permite asignar una URI
especfica (por ejemplo /contacto) a cierta informacin acerca de cmo se
debe manejar dicha peticin (por ejemplo, ejecutar el
mtodo contactoAction()).
-
8/11/2019 Libro Symfony2.4
16/102
Form: una completa y flexible plataforma para crear formularios y procesar los
datos presentados en ellos.
Validator: un sistema para crear reglas sobre datos y as comprobar si los
datos que presenta el usuario son vlidos o no siguiendo esas reglas.
ClassLoader: una librera para cargar automticamente clases PHP sin
necesidad de aadir instrucciones requirea mano en los archivos que
contienen esas clases.
Templating: juego de herramientas para utilizar plantillas, que soporta desde
la herencia de plantillas (es decir, una plantilla est decorada con un diseo) y
hasta otras tareas comunes de las plantillas.
Security: una poderosa librera para manejar todo tipo de seguridad dentro deuna aplicacin.
Translation: plataforma para traducir cadenas de texto en tu aplicacin.
Todos y cada uno de estos componentes estn desacoplados, lo que significa que
puedes utilizarlos en cualquier proyecto PHP, independientemente de si utilizas la
plataforma Symfony2.
Cada componente est diseado para utilizarlo si es conveniente o para sustituirlocuando sea necesario.
1.5.2. La solucin completa: la plataforma Symfony2
Qu es la plataforma Symfony2? La plataforma Symfony2 es una librera PHP
que realiza dos tareas diferentes:
Proporciona una seleccin de componentes Symfony2 y algunas libreras de
terceros (por ejemplo, SwiftMailerpara enviar mensajes de correo
electrnico).
Define una configuracin adecuada e incluye una capa que integra todas las
diferentes partes (componentes, libreras, etc.)
-
8/11/2019 Libro Symfony2.4
17/102
El objetivo de la plataforma es integrar muchas herramientas independientes con
el fin de proporcionar una experiencia coherente al desarrollador.
Symfony2 proporciona un potente conjunto de herramientas para desarrollar
aplicaciones web rpidamente sin afectar excesivamente a tu forma de trabajar. Siests comenzando con Symfony2, lo mejor es que utilices una distribucin de
Symfony2, que proporciona un esqueletode un proyecto Symfony2 de prueba
con varios parmetros ya preconfigurados. Si eres un usuario avanzado, puedes
crearte tu propia distribucin o incluso utilizar componentes individuales de
Symfony2
Captulo 2.De PHP a Symfony2Por qu Symfony2 es mejor que escribir cdigo PHP a pelo?Si nunca has
usado una plataforma PHP, o no ests familiarizado con la filosofa MVC, o
simplemente te preguntas qu es todo ese ruidogenerado en torno a Symfony2,
este captulo es para ti. En vez de contarte que Symfony2 te permite desarrollar
software ms rpido y mejor que con PHP simple, vas a poder comprobarlo tu
mismo.
En este captulo, vamos a escribir una aplicacin sencilla en PHP simple, y luego
la reconstruiremos para que est mejor organizada. Podrs viajar a travs del
tiempo, viendo las decisiones de por qu el desarrollo web ha evolucionado en losltimos aos hasta donde est ahora.
Al final del captulo, vers cmo Symfony2 se encarga de todas las tareas
comunes (y aburridas) mientras que te permite recuperar el control de tu cdigo.
2.1.Un blog sencillo creado con PHP simpleEn este captulo, crearemos la tpica aplicacin de blog utilizando slo PHP
simple.
Para empezar, crea una pgina que muestre las entradas del blog que se han
persistido en la base de datos. Escribirla en PHP simple es rpido, pero un
poco sucio:
-
8/11/2019 Libro Symfony2.4
18/102
$link=mysql_connect('localhost','myuser','mypassword');
mysql_select_db('blog_db',$link);
$result=mysql_query('SELECT id, title FROM post',$link);
?>
List of Posts
List of Posts
-
8/11/2019 Libro Symfony2.4
19/102
El cdigo anterior es fcil de escribir y se ejecuta muy rpido, pero en cuanto la
aplicacin crece, es muy difcil de mantener. Sus principales problemas son los
siguientes:
No hay comprobacin de errores: qu sucede si falla la conexin a la basede datos?
Organizacin deficiente: si la aplicacin crece, este nico archivo cada vez
ser ms difcil de mantener, hasta que finalmente sea imposible. Dnde se
debe colocar el cdigo para manejar los formularios? Cmo se pueden
validar los datos? Dnde debe ir el cdigo para enviar mensajes de correo
electrnico?
Es difcil reutilizar el cdigo: ya que todo est en un archivo, no hay manerade volver a utilizar alguna parte de la aplicacin en otras pginas del blog.
NOTAOtro problema no mencionado aqu es el hecho de que la base de datos est
vinculada a MySQL. Aunque no se ha tratado aqu, Symfony2 integraDoctrine,
una librera que permite abstraer el acceso a la base de datos y el manejo de la
informacin.
Vamos a trabajar a continuacin en la solucin de estos y muchos otros problemas
ms.
2.1.1. Aislando la parte de la vista
El cdigo se puede mejorar fcilmente separando la lgica de la aplicacin (cdigo
PHP puro) y "la parte de la vista"o "presentacin", que est formada por todo lo
relacionado con el cdigo HTML:
-
8/11/2019 Libro Symfony2.4
20/102
$posts=array();
while($row=mysql_fetch_assoc($result)){
$posts[]=$row;
}
mysql_close($link);
// incluye el cdigo HTML de la vista
require'templates/list.php';
Ahora el cdigo HTML est guardado en un archivo separado
(templates/list.php). Este archivo contiene todo el cdigo HTML junto con
algunas pocas instrucciones PHP que utilizan la sintaxis alternativa recomendada
para las plantillas PHP:
List of Posts
List of Posts
-
8/11/2019 Libro Symfony2.4
21/102
Por convencin, el archivo que contiene toda la lgica de la aplicacin (index.php)
se conoce como"controlador". El trmino controladores una palabra que se utiliza
mucho, independientemente del lenguaje o plataforma que utilices. Simplemente
se refiere a la zona de tu cdigo que procesa la peticin del usuario y prepara la
respuesta.
En este caso, nuestro controlador obtiene los datos de la base de datos y, luego
los incluye en una plantilla para presentarlos al usuario. Con el controlador aislado,
podramos cambiar fcilmente slo el archivo de la plantilla si queremos servir los
contenidos del blog en otro formato (por ejemplo,list.json.phppara el
formatoJSON).
2.1.2. Aislando la lgica de la aplicacin (el dominio)
Por ahora la aplicacin slo contiene una pgina. Pero qu pasa si una segunda
pgina necesita utilizar la misma conexin a la base de datos, e incluso el mismo
resultado de la bsqueda de las entradas del blog? La solucin consiste en
refactorizar el cdigo para que todas estas funciones bsicas de acceso a datosde la aplicacin estn aisladas en un nuevo archivo llamado model.php:
-
8/11/2019 Libro Symfony2.4
22/102
}
functionclose_database_connection($link)
{
mysql_close($link);
}
functionget_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;
}
TRUCOSe utiliza el nombre model.phppara el archivo porque el acceso a la lgica y
los datos de una aplicacin se conoce tradicionalmente como la capa
del "modelo". En una aplicacin bien organizada, la mayora del cdigo que
representa tu "lgica de negocio"debe estar en el modelo (en lugar del
controlador). Y, a diferencia de este ejemplo, slo una parte (o ninguna) del
modelo realmente est interesada en acceder a la base de datos.
El controlador (index.php) ahora es muy sencillo:
-
8/11/2019 Libro Symfony2.4
23/102
require_once'model.php';
$posts=get_all_posts();
require'templates/list.php';
Ahora, la nica tarea del controlador es conseguir los datos de la capa del modelo
de la aplicacin (el modelo) y utilizar una plantilla para mostrar los datos.
Este es un ejemplo muy simple del patrn modelo - vista - controlador.
2.1.3. Aislando el diseo
La aplicacin ahora est dividida en tres partes distintas, lo que nos ofrece variasventajas y la oportunidad de volver a utilizar casi todo en diferentes pginas.
La nica parte del cdigo que no se puede reutilizar es el diseo HTML + CSS de
la pgina. Vamos a solucionar este problema creando un nuevo archivo
llamado base.php:
La plantilla original (templates/list.php) ahora se puede simplificar para que
utilice el archivobase.phpanterior como base:
-
8/11/2019 Libro Symfony2.4
24/102
List of Posts
El cdigo anterior introducido una metodologa que nos permite reutilizar el diseo.
Desafortunadamente, para conseguirlo estamos obligados a utilizar en la plantilla
algunas funciones de PHP poco recomendables (ob_start(), ob_get_clean()).Symfony2 utiliza un componente de plantillas (Templating) que nos permite realizar
esto de una manera ms limpiay sencilla. En breve lo
2.2.Agregando una pginashowal blogLa pgina listdel blog se ha rediseado para que el cdigo est mejor
organizado y sea reutilizable. Para probar que esto es as, aade una
pgina showal blog, que muestre una entrada individual del blog identificada por
un parmetro de consulta id.
Para empezar, crea una nueva funcin en el archivo model.phpque recupere un
resultado individual del blog basndose en un identificador dado:
// model.php
functionget_post_by_id($id)
-
8/11/2019 Libro Symfony2.4
25/102
{
$link=open_database_connection();
$id=mysql_real_escape_string($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;
}
A continuacin, crea un nuevo archivo llamado show.php, que ser el controlador
para esta nueva pgina:
-
8/11/2019 Libro Symfony2.4
26/102
Como has visto, es muy fcil crear la segunda pgina sin duplicar cdigo. Sin
embargo, esta nueva pgina introduce algunos problemas adicionales que una
plataforma web puede resolver por ti. Por ejemplo, si el usuario proporciona un
valor ilegal para el parmetro ido un valor vaco, la consulta har que la pgina sebloquee. En este caso, sera mejor que la aplicacin generara una pgina de error
de tipo 404(algo que no es fcil con el cdigo actual de la aplicacin). Peor an, si
no te acuerdas de limpiarcon la funcin mysql_real_escape_string() el
parmetro idque te pasa el usuario, tu base de datos sera vulnerable a los
ataques de tipo inyeccin SQL.
Otro problema importante es que cada archivo de tipo controlador debe incluir el
archivo model.php. Qu pasara si cada archivo de controlador de repente tuviera
que incluir un archivo adicional o realizar alguna tarea global (por ejemplo, reforzarla seguridad)?
Tal como est ahora, el cdigo tendra que incluir a mano todos los archivos de los
controladores. Si olvidas incluir algo en un solo archivo, esperamos que no sea
alguno relacionado con la seguridad.
2.3.El controlador frontal al rescateUna solucin mucho mejor es usar un controlador frontal: un nico archivo PHP a
travs del cual se procesen todas las peticiones del usuario. Con un controlador
frontal, la URI de la aplicacin cambia un poco, pero se vuelve mucho ms flexible:
Sin controlador frontal:
/index.php => (ejecuta index.php) la pgina que lista los artculos.
-
8/11/2019 Libro Symfony2.4
27/102
/show.php => (ejecuta show.php) la pgina que muestra un artculo especfico.
Con index.php como controlador frontal
/index.php => (ejecuta index.php) la pgina que lista los artculos.
/index.php/show => (ejecuta index.php) la pgina que muestra un artculo especfico.
TRUCOEl nombre del archivo index.phpse puede eliminar en las URLs si utilizas
las reglas de reescritura del servidor web Apache (o las equivalentes de los dems
servidores web). En ese caso, la URI resultante de la pgina showdel blog sera
simplemente /show.
Cuando se usa un controlador frontal, un solo archivo PHP (index.phpen estecaso) procesa todas las peticiones. Para la pgina showdel
blog, /index.php/showrealmente ejecuta el archivo index.php, que ahora es el
responsable de dirigir internamente las peticiones basndose en la URI completa.
Como puedes ver, un controlador frontal es una herramienta muy poderosa.
2.3.1. Creando el controlador frontal
Ests a punto de dar un gran paso en la aplicacin. Con un archivo manejando
todas las peticiones, puedes centralizar cosas como el manejo de la seguridad, lacarga de la configuracin y el enrutamiento. En nuestra
aplicacin, index.phpahora debe ser lo suficientemente inteligente como para
mostrar la lista de entradas del blog o mostrar la pgina de una entrada particular
basndose en la URI solicitada:
-
8/11/2019 Libro Symfony2.4
28/102
// encamina la peticin internamente
$uri=$_SERVER['REQUEST_URI'];
if($uri=='/index.php'){
list_action();
}elseif($uri=='/index.php/show'&&isset($_GET['id'])){
show_action($_GET['id']);
}else{
header('Status: 404 Not Found');
echo'Page Not Found';
}
Para organizar mejor el cdigo, los dos controladores anteriores
(archivos index.phpy show.php) se han convertido en funciones PHP del nuevo
archivo controllers.php:
functionlist_action()
{
$posts=get_all_posts();
require'templates/list.php';
}
functionshow_action($id)
{
$post=get_post_by_id($id);
require'templates/show.php';
}
Como controlador frontal, index.phpha asumido un papel completamente nuevo,
que incluye la carga de los archivos principales de la aplicacin
(model.phpy controllers.php) y la decisin de ejecutar uno de los dos
controladores (las funciones list_action()y show_action()). En realidad, el
-
8/11/2019 Libro Symfony2.4
29/102
controlador frontal est empezando a parecerse y actuar como el mecanismo que
define Symfony2 para la manipulacin y enrutado de peticiones.
TRUCOOtra ventaja del controlador frontal es la flexibilidad de las URL. Ten en
cuenta que la URL de la pgina showdel blog se puede cambiarde /showa /readcambiando el cdigo en un nico lugar. Antes, era necesario
cambiar todo un archivo para cambiar el nombre. En Symfony2, las URL son
incluso ms flexibles.
Por ahora, la aplicacin ha evolucionado de un nico archivo PHP, a una
estructura organizada que permite la reutilizacin de cdigo. Debes estar contento,
pero an lejos de estar satisfecho. Por ejemplo, el sistema de enrutamiento es
muy mejorable, ya que no reconoce por ejemplo que la pginalist(/index.php)
tambin debe ser accesible a travs de /(si has agregado las reglas dereescritura deApache). Adems, en lugar de programar el blog, hasperdidotu
tiempo en preparar la "arquitectura" del cdigo (por ejemplo, el enrutamiento, los
controladores, las plantillas, etc.) Y pronto tendrs que perder ms tiempo en la
gestin de los formularios, la validacin de la informacin, crear un archivo de log,
la gestin de la seguridad, etc.
Por qu tienes que dedicarte a solucionar estos problemas que se repiten una y
otra vez en todos los proyectos?
2.3.2. Aadiendo un toque de Symfony2
Symfony2 al rescate! Antes de utilizar Symfony2, debes descargar sus archivos.
Para ello se utiliza la herramienta llamada Composer, que se encarga de
descargar la versin correcta de los archivos de Symfony, todas sus dependencias
y tambin proporciona un cargador automtico de clases (llamadoclass loaderen
ingls). Un cargador automtico es una herramienta que permite empezar a utilizar
clases PHP sin incluir explcitamente el archivo que contiene la clase.
Dentro del directorio raz del proyecto crea un archivo llamado composer.jsoncon
el siguiente contenido:
{
"require":{
"symfony/symfony":"2.4.*"
-
8/11/2019 Libro Symfony2.4
30/102
},
"autoload":{
"files":["model.php","controllers.php"]
}
}
A continuacin,descarga Composery ejecuta despus el siguiente cdigo para
descargar Symfony dentro del directorio vendor/del proyecto:
$ php composer.phar install
Adems de descargar todas las dependencias, Composergenera un archivo
llamadovendor/autoload.php, que se encarga de cargar automticamente todas las
clases del frameworkSymfony y de todas las libreras que aadas en laseccin autoloaddel archivo composer.json.
La esencia de la filosofa Symfony es que el trabajo principal de una aplicacin es
interpretar cada peticin y devolver una respuesta. Con este fin, Symfony2
proporciona las clases Requesty Response. Estas clases son representaciones
orientadas a objetos de la peticin HTTP que se est procesando y la respuesta
HTTP que se devolver. salas para mejorar el blog:
-
8/11/2019 Libro Symfony2.4
31/102
$response=list_action();
}elseif($uri=='/show'&&$request->query->has('id')){
$response=show_action($request->query->get('id'));
}else{
$html='Page Not Found';
$response=newResponse($html,Response::HTTP_NOT_FOUND);
}
// enva las cabeceras y la respuesta
$response->send();
Los controladores se encargan de devolver un objeto Response. Para simplificar la
generacin del cdigo HTML de la respuesta, crea una nueva funcin
llamada render_template(), la cual, por cierto, acta un poco como el motor de
plantillas de Symfony2:
// controllers.php
useSymfony\Component\HttpFoundation\Response;
functionlist_action()
{
$posts=get_all_posts();
$html=render_template('templates/list.php',array('posts'=>$posts));
returnnewResponse($html);
}
functionshow_action($id)
{
-
8/11/2019 Libro Symfony2.4
32/102
$post=get_post_by_id($id);
$html=render_template('templates/show.php',array('post'=>$post));
returnnewResponse($html);
}
// funcin ayudante para reproducir plantillas
functionrender_template($path,array$args)
{
extract($args);
ob_start();
require$path;
$html=ob_get_clean();
return$html;
}
Aunque solo ha aadido una pequesima parte de las ideas de Symfony2, la
aplicacin ahora es ms flexible y fiable. El objeto Requestproporciona una
manera segura para acceder a la informacin de la peticin HTTP. El
mtodo getPathInfo()por ejemplo devuelve una URI limpia (siempre
devolviendo/showy nunca /index.php/show).
Por lo tanto, incluso si el usuario va a /index.php/show, la aplicacin es lo
suficientemente inteligente para encaminar la peticin hacia show_action().
El objeto Responseproporciona flexibilidad al construir la respuesta HTTP,permitiendo que las cabeceras HTTP y el contenido se definan a travs de una
interfaz orientada a objetos.
Y aunque las respuestas en esta aplicacin son simples, esta flexibilidad ser muy
til en cuanto tu aplicacin crezca.
-
8/11/2019 Libro Symfony2.4
33/102
2.3.3. Aplicacin de ejemplo en Symfony2
El blog ha mejorado bastante, pero todava contiene una gran cantidad de cdigo
para ser una aplicacin tan simple. Durante las mejoras de la aplicacin, se ha
creado un sistema de enrutamiento muy sencillo y otro mtodo que
utiliza ob_start()y ob_get_clean()para procesar plantillas. Si vas a continuardesarrollando este blog, lo mejor es que utilices los
componentes Routingy Templatingde Symfony para mejorar esa parte sin
esfuerzo.
En lugar de resolver de nuevo los mismos problemas de siempre, deja que
Symfony2 se encargue de ellos por ti. Aqu est la misma aplicacin de ejemplo,
pero construida ahora con Symfony2:
-
8/11/2019 Libro Symfony2.4
34/102
publicfunctionshowAction($id)
{
$post=$this->get('doctrine')
->getManager()
->getRepository('AcmeBlogBundle:Post')
->find($id);
if(!$post){
// hace que se muestre la pgina de error 404
throw$this->createNotFoundException();
}
return$this->render('AcmeBlogBundle:Blog:show.html.php',array('post'=>$post));
}
}
Los dos controladores siguen siendo ms o menos pequeos. Cada uno utiliza la
librera ORM de Doctrine para recuperar objetos de la base de datos y el
componente Templatingpara generar el cdigo HTML con una plantilla y devolver
un objeto Response. La plantilla listahora es un poco ms simple:
List of Posts
-
8/11/2019 Libro Symfony2.4
35/102
NOTATe vamos a dejar como ejercicio la plantilla show, porque debera ser trivial
crearla basndote en la plantilla list.
Cuando arranca el motor de Symfony2 (llamado kernel), necesita un mapapara
saber qu controladores ejecutar en base a la informacin solicitada por los
usuarios. Este mapase crea con la configuracin de enrutamiento, que
proporciona esta informacin en formato legible:
# app/config/routing.yml
blog_list:
path: /blog
-
8/11/2019 Libro Symfony2.4
36/102
defaults: {_controller: AcmeBlogBundle:Blog:list }
blog_show:
path: /blog/show/{id}
defaults: {_controller: AcmeBlogBundle:Blog:show }
Ahora que Symfony2 se encarga de todas las tareas repetitivas, el controlador
frontal es muy simple. Y ya que hace tan poco, nunca tienes que volver a tocarlo
una vez creado (y si utilizas una distribucin Symfony2, ni siquiera tendrs que
crearlo!):
-
8/11/2019 Libro Symfony2.4
37/102
Tu aplicacin cuenta con cdigo claro y bien organizado(aunque Symfony
no te obliga a ello). Esto facilita la reutilizacinde cdigo y permite a los
nuevos desarrolladores ser productivos en el proyecto con mayor rapidez.
El 100% del cdigo que escribes es para tu aplicacin. No necesitasdesarrollar o mantener herramientas de bajo nivelcomo la carga
automtica de clases, el enrutamiento o los controladores.
Symfony2 te proporciona acceso a herramientas de software libretales
como Doctrine, plantillas, seguridad, formularios, validacin y traduccin (por
nombrar algunas).
La aplicacin ahora dispone de URLs totalmente flexiblesgracias al
componente Routing.
La arquitectura centrada en HTTP de Symfony2 te da acceso a herramientas
muy potentes, como por ejemplo la cach HTTP(mediante la cach HTTP
interna de Symfony2o mediante herramientas ms avanzadas
comoVarnish). Esto se explica ms adelante en el captulo sobre la cach.
Y lo mejor de todo, utilizando Symfony2, ahora tienes acceso a un conjunto de
herramientas desoftware libre de alta calidad desarrolladas por la comunidad
Symfony2!
Puedes encontrar una buena coleccin de herramientas comunitarias de
Symfony2 enKnpBundles.com.
2.4.Mejorando las plantillasSi quieres utilizarlo, Symfony2 incluye de serie un motor de plantillas
llamadoTwigque hace que las plantillas se escriban ms rpido y sean ms
fciles de leer.
En otras palabras, la aplicacin de ejemplo desarrollada anteriormente podra
incluso tener menos cdigo. Considera por ejemplo la siguiente
plantilla listreescrita con Twig:
{# src/Acme/BlogBundle/Resources/views/Blog/list.html.twig #}
http://www.varnish-cache.org/http://www.varnish-cache.org/http://www.varnish-cache.org/http://knpbundles.com/http://knpbundles.com/http://twig.sensiolabs.org/http://twig.sensiolabs.org/http://twig.sensiolabs.org/http://twig.sensiolabs.org/http://knpbundles.com/http://www.varnish-cache.org/ -
8/11/2019 Libro Symfony2.4
38/102
{%extends"::base.html.twig"%}
{%blocktitle%}List of Posts{%endblock%}
{%blockbody%}
List of Posts
{%forpostinposts%}
{{post.title}}
{%endfor%}
{%endblock%}
Tambin es muy fcil escribir la plantilla base.html.twigcorrespondiente:
{# app/Resources/views/base.html.twig #}
{%blocktitle%}Default title{%endblock%}
{%blockbody%}{%endblock%}
-
8/11/2019 Libro Symfony2.4
39/102
Twig est completamente integrado en Symfony2. Aunque Symfony2 siempre
soportar las plantillas PHP, en los siguientes captulos se van a seguir
presentando algunas de las muchas ventajas de Twig respecto a las plantillas
PHP. Para ms informacin, consulta el captulo sobre las plantillas.
Captulo 4.Creando pginas en Symfony2Crear una nueva pgina en Symfony2 es un proceso muy sencillo de dos pasos:
Crear una ruta: una ruta define la URL de tu pgina (por ejemplo /sobre) y
especifica el controlador (que en realidad es una funcin PHP) que Symfony2
ejecuta cuando la URL de la peticin del usuario coincida con el patrn de la
ruta.
Crear un controlador: un controlador es una funcin PHP que obtiene lapeticin del usuario y la transforma en el objeto Responsecon el que Symfony2
crea la respuesta que se enva al usuario .
Nos encanta este enfoque simple porque coincide con la forma en que funciona la
Web. Cada interaccin en la Web se inicia con una peticin HTTP. El trabajo de la
aplicacin simplemente es interpretar la peticin y devolver la respuesta HTTP
adecuada.
Symfony2 sigue esta filosofa y te proporciona las herramientas y convencionespara mantener organizada tu aplicacin a medida que crece en usuarios y
complejidad.
4.1.La pginaHola Symfony!Vamos a empezar con una aplicacin derivada del clsico "Hola Mundo!". Cuando
hayamos terminado, el usuario podr recibir un saludo personal (por
ejemplo, "Hola Symfony") al ir a la siguiente URL:
http://localhost/app_dev.php/hello/Symfony
Ms adelante podrs sustituir la palabra Symfonycon cualquier otro nombre al que
darle la bienvenida. Para crear la pgina, sigue el proceso simple de dos pasos.
NOTAEste captulo supone que ya has descargado Symfony2 y configurado tu
servidor web. En la URL del ejemplo anterior se supone que localhostapunta al
-
8/11/2019 Libro Symfony2.4
40/102
directorio webde tu nuevo proyecto Symfony2. Para obtener una informacin ms
detallada sobre cmo hacerlo, consulta la documentacin del servidor Web que
ests usando.
Estos son los enlaces a las pginas de documentacin adecuadas para los dosservidores web ms populares:
Para el servidor Apache, consulta la documentacin deApache sobre
DirectoryIndex.
Para Nginx, consulta la documentacin deubicacin HttpCoreModule de
Nginx.
4.2.Antes de empezar, crea el bundleAntes de empezar, tendrs que crear un bundle(que se podra traducir
como "paquete"). En Symfony2, un bundle es como unplugin, con la salvedad de
que todo el cdigo de tu aplicacin se almacena dentro de bundles.
Un bundle no es ms que un directorio que almacena todo lo relacionado con una
funcin especfica, incluyendo clases PHP, configuracin, e incluso hojas de estilo
y archivos deJavascript.
Para crear un bundle llamado AcmeHelloBundle(el bundle de ejemplo que vamos a
construir en este captulo), ejecuta el siguiente comando y sigue las instrucciones
en pantalla (acepta todas las opciones predeterminadas):
$ php app/console generate:bundle --namespace=Acme/HelloBundle --format=yml
Sin que te des cuenta, se ha creado un directorio para el bundle
en src/Acme/HelloBundle. Adems se ha aadido automticamente una lnea en el
archivo app/AppKernel.phppara registrar el bundle en el ncleo de Symfony:
// app/AppKernel.php
publicfunctionregisterBundles()
{
$bundles=array(
...,
http://httpd.apache.org/docs/2.0/mod/mod_dir.htmlhttp://httpd.apache.org/docs/2.0/mod/mod_dir.htmlhttp://httpd.apache.org/docs/2.0/mod/mod_dir.htmlhttp://httpd.apache.org/docs/2.0/mod/mod_dir.htmlhttp://wiki.nginx.org/HttpCoreModule#locationhttp://wiki.nginx.org/HttpCoreModule#locationhttp://wiki.nginx.org/HttpCoreModule#locationhttp://wiki.nginx.org/HttpCoreModule#locationhttp://wiki.nginx.org/HttpCoreModule#locationhttp://wiki.nginx.org/HttpCoreModule#locationhttp://httpd.apache.org/docs/2.0/mod/mod_dir.htmlhttp://httpd.apache.org/docs/2.0/mod/mod_dir.html -
8/11/2019 Libro Symfony2.4
41/102
newAcme\HelloBundle\AcmeHelloBundle(),
);
// ...
return$bundles;
}
Ahora que ya est configurado el bundle, puedes comenzar a construir tu
aplicacin dentro del bundle.
4.2.1. Paso 1: Creando la ruta
Por defecto, el archivo de configuracin de enrutamiento en una aplicacinSymfony2 se encuentra enapp/config/routing.yml . Si lo prefieres, y al igual que
en el resto de la configuracin en Symfony2, puedes utilizar el formato XML o PHP
para configurar tus rutas.
Si te fijas en el archivo de enrutamiento principal, vers que Symfony ya ha
agregado una entrada al generar el bundle AcmeHelloBundle:
YAML
XML
PHP# app/config/routing.yml
acme_hello:
resource: "@AcmeHelloBundle/Resources/config/routing.yml"
prefix: /
Esta directiva de configuracin le dice a Symfony que cargue la configuracin de
enrutamiento del archivo Resources/config/routing.ymlque se encuentra en elinterior del bundle AcmeHelloBundle.
En otras palabras, puedes configurar tus rutas directamente en el
archivo app/config/routing.ymlo puedes definirlas en varias partes de la
aplicacin y despus las importas desde ese archivo.
http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_1_eb7a3http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_1_eb7a3http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_2_eb7a3http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_2_eb7a3http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_3_eb7a3http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_3_eb7a3http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_3_eb7a3http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_2_eb7a3http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_1_eb7a3 -
8/11/2019 Libro Symfony2.4
42/102
Ahora que el archivo routing.ymldel bundle se importa desde el archivo de
enrutamiento principal de la aplicacin, aade la nueva ruta que define la URL de
la pgina que ests a punto de crear:
YAML
XML
PHP# src/Acme/HelloBundle/Resources/config/routing.yml
hello:
path: /hello/{name}
defaults: {_controller: AcmeHelloBundle:Hello:index }
La ruta se compone bsicamente de dos partes: el path, que es la URL con la quedebe coincidir la peticin del usuario para activar la ruta, y un array
llamado defaults, que especifica el controlador que se ejecuta. Las partes de la
URL encerradas entre comillas indican que su valor puede variar. De esta
forma, {name}significa que las URL /hello/Ryan, /hello/Fabieno cualquier otra
URI similar coincidir con esta ruta. El valor de las partes variables tambin se
pasa al controlador, que puede acceder a ellos a travs del nombre asignado en la
propia ruta (nameen este caso).
NOTAEl sistema de enrutamiento tiene muchas ms caractersticas para crear URI
flexibles y avanzadas en tu aplicacin. Para ms detalles, consulta el captulo de
enrutamiento.
4.2.2. Paso 2: Creando el controlador
Cuando el usuario solicita la URL /hello/Ryan, se activa la ruta hello, a la que
corresponde el controlador AcmeHelloBundle:Hello:index , que es realmente el
cdigo que se ejecuta. El segundo paso del proceso de creacin de pginas
consiste precisamente en crear ese controlador.
La cadena AcmeHelloBundle:Hello:indexes el nombre lgicodel controlador, que
se traduce como el mtodo indexAction()de una clase PHP
llamada Acme\HelloBundle\Controller\Hello . Crea en primer lugar este archivo
dentro de tu bundle AcmeHelloBundle:
http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_1_eb8b6http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_1_eb8b6http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_2_eb8b6http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_2_eb8b6http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_3_eb8b6http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_3_eb8b6http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_3_eb8b6http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_2_eb8b6http://librosweb.es/symfony_2_4/capitulo_4/antes_de_empezar_crea_el_bundle.html#select_tab_1_eb8b6 -
8/11/2019 Libro Symfony2.4
43/102
// src/Acme/HelloBundle/Controller/HelloController.php
namespaceAcme\HelloBundle\Controller;
useSymfony\Component\HttpFoundation\Response;
classHelloController
{
}
En realidad, el controlador no es ms que un mtodo PHP que t creas y Symfony
ejecuta. Aqu es donde el cdigo utiliza la informacin de la peticin para construir
y preparar el recurso solicitado. Salvo en algunos casos avanzados, el resultadofinal de un controlador siempre es el mismo: un objeto Responsede Symfony2.
Crea el mtodo indexActionque Symfony ejecutar cuando se sirva la ruta hello:
// src/Acme/HelloBundle/Controller/HelloController.php
// ...
classHelloController
{
publicfunctionindexAction($name)
{
returnnewResponse('Hello '.$name.'!');
}
}
El controlador es muy sencillo: crea un nuevo objeto de tipo Responsey cuyo
primer argumento es el contenido que se utiliza para crear la respuesta enviada al
usuario (en este caso, una pgina HTML muy simple).
-
8/11/2019 Libro Symfony2.4
44/102
Enhorabuena! Despus de crear solamente una ruta y un controlador ya tienes
una pgina completamente funcional! Si todo lo has configurado correctamente, la
aplicacin debe darte la bienvenida al acceder a la siguiente URL:
http://localhost/app_dev.php/hello/Ryan
TRUCOTambin puedes ver tu aplicacin en el entorno prodo de produccin
visitando:
http://localhost/app.php/hello/Ryan
Si se produce un error, probablemente sea porque necesitas vaciar la cach de
produccin ejecutando el siguiente comando:
php app/console cache:clear --env=prod --no-debug
El tercer y ltimo paso para crear una pgina es opcional pero casi todas lasaplicaciones lo hacen: crear una plantilla.
NOTALos controladores son el punto de entrada principal a tu cdigo y la clave en
la creacin de pginas. Puedes encontrar mucha ms informacin en el captulo
dedicado a los controladores.
4.2.3. Paso 3 opcional: Creando la plantilla
Las plantillas te permiten mover toda la parte de la vista (es decir, el cdigo HTML)
a un archivo separado y reutilizar diferentes partes del diseo de la pgina. En vez
de escribir el cdigo HTML dentro del controlador, genera el cdigo HTML a partir
de una plantilla:
// src/Acme/HelloBundle/Controller/HelloController.php
namespaceAcme\HelloBundle\Controller;
useSymfony\Bundle\FrameworkBundle\Controller\Controller;
classHelloController extendsController
{
publicfunctionindexAction($name)
-
8/11/2019 Libro Symfony2.4
45/102
{
return$this->render('AcmeHelloBundle:Hello:index.html.twig',array('name'=>$name));
// si utilizas PHP en vez de Twig
// return $this->render('AcmeHelloBundle:Hello:index.html.php', array('name' => $name));
}
}
NOTAPara poder usar el mtodo render(), tu controlador debe extender de la
claseSymfony\Bundle\FrameworkBundle\Controller\Controller, la cual aade atajos
para las tareas ms comunes de los controladores. Esto se hace en el ejemploanterior aadiendo la declaracin usedebajo del namespacey luego aadiendo
el extends Controllera la clase.
El mtodo render()crea un objeto Responsey le aade el contenido resultante de
renderizar la plantilla. As que como cualquier otro controlador, el cdigo anterior
realmente est devolviendo un objeto de tipo Response.
Ten en cuenta que puedes procesar las plantillas de dos formas diferentes. Por
defecto Symfony2 admite dos lenguajes de plantillas: las clsicas plantillascreadas con PHP y las nuevas y concisas plantillas creadas con Twig. No te
asustes porque puedes elegir libremente cul utilizar o incluso mezclar las dos en
el mismo proyecto.
Al procesar la plantilla AcmeHelloBundle:Hello:index.html.twig, el controlador
utiliza la siguiente convencin de nomenclatura:
NombreBundle:NombreControlador:NombrePlantilla
Este es el nombre lgicode la plantilla, que se traduce a un archivo fsicoutilizando la siguiente convencin:
/Resources/views//
En este caso, AcmeHelloBundlees el nombre del bundle, Helloes el controlador
e index.html.twigla plantilla:
-
8/11/2019 Libro Symfony2.4
46/102
{# src/Acme/HelloBundle/Resources/views/Hello/index.html.twig #}
{%extends'::base.html.twig'%}
{%blockbody%}
Hello {{name}}!
{%endblock%}
Hello !
Veamos la situacin a travs de la plantilla Twiglnea por lnea:
La etiqueta extendsindica que se utiliza una plantilla padre donde se define el
diseo del sitio web.
La etiqueta blockindica que todo su contenido se debe colocar dentro de un
bloque llamado body. Como se explicar ms adelante, la plantilla padre
(base.html.twig) es la responsable de definir ese bloque y de mostrarlo en la
pgina HTML adecuadamente.
La plantilla padre se indica como ::base.html.twig, por lo que no incluye ni la
parte del nombre del bundle ni la del nombre del controlador (de ah los dos
puntos dobles (::) al principio). Esto significa que la plantilla no se encuentra
dentro de ningn bundle, sino en el directorio appdel proyecto:
{# app/Resources/views/base.html.twig #}
{%blocktitle%}Welcome!{%endblock%}
{%blockstylesheets%}{%endblock%}
-
8/11/2019 Libro Symfony2.4
47/102
{%blockbody%}{%endblock%}
{%blockjavascripts%}{%endblock%}
El archivo de la plantilla base define el diseo HTML y muestra el contenido del
bloque bodyque se defini en la plantilla index.html.twig. Tambin muestra elcontenido de un bloque llamado title, que si quieres puedes definir en la
plantilla index.html.twig. Como no has definido ese bloque en la plantilla, se
utiliza el valor predeterminado "Welcome!".
-
8/11/2019 Libro Symfony2.4
48/102
Las plantillas son realmente tiles para generar y organizar el contenido de las
pginas de la aplicacin. Una plantilla puede generar cualquier cosa, desde el
cdigo HTML o CSS hasta cualquier otra cosa que el controlador tenga que
devolver.
Dentro del ciclo peticin/respuesta, el motor de plantillas simplemente es una
herramienta opcional. Recuerda que el objetivo de cada controlador es devolver
un objeto Response. As que por muy potentes que sean, las plantillas son solo una
forma opcional de generar ese objeto Response.
4.3.La estructura de directoriosLas secciones anteriores explican la filosofa en la que se basa la creacin y
procesamiento de pginas en Symfony2. Tambin se ha mencionado cmo estn
estructurados y organizados los proyectos Symfony2. Al final de esta seccin,
sabrs dnde encontrar y colocar diferentes tipos de archivos y por qu.
Aunque se puede cambiar, por defecto todas las aplicaciones Symfony tienen la
misma estructura de directorios sencilla (y recomendada):
app/: contiene la configuracin de la aplicacin.
src/: aqu se encuentra todo el cdigo PHP de la aplicacin.
vendor/: por convencin aqu se guardan todas las libreras creadas por
terceros.
web/: este es el directorio web raz y contiene todos los archivos que se
pueden acceder pblicamente.
4.3.1. El directorio web
El directorio web raz es el lugar donde se encuentran todos los archivos pblicos
y estticos tales como imgenes, hojas de estilo y archivos JavaScript. Tambines el lugar donde se definen todos los controladores frontales, como por ejemplo
el siguiente:
// web/app.php
require_once__DIR__.'/../app/bootstrap.php.cache';
-
8/11/2019 Libro Symfony2.4
49/102
require_once__DIR__.'/../app/AppKernel.php';
useSymfony\Component\HttpFoundation\Request;
$kernel=newAppKernel('prod',false);
$kernel->loadClassCache();
$kernel->handle(Request::createFromGlobals())->send();
El archivo del controlador frontal (app.phpen este ejemplo) es el archivo PHP que
realmente se ejecuta cuando utilizas una aplicacin Symfony2 y su trabajo
consiste en arrancar la aplicacinutilizando una clase del ncleo (AppKernel).
TRUCOTener un controlador frontal significa que se utilizan URL diferentes y ms
flexibles que las de una aplicacin PHP tpica. Cuando se dispone de un
controlador frontal, las URL se formatean de la siguiente manera:
http://localhost/app.php/hello/Ryan
El controlador frontal, app.php, se ejecuta y la URL interna: /hello/Ryanse dirige
internamente segn la configuracin de enrutamiento.
Si adems utilizas el mdulo mod_rewritede Apache, puedes forzar la ejecucin
del archivo app.phpsin necesidad de incluirlo en la URL, por lo que as las URL son
todava ms limpias:
http://localhost/hello/Ryan
Aunque los controladores frontales son esenciales para servir cada peticin, rara
vez los tendrs que modificar o incluso pensar en ellos. Los mencionaremos
brevemente de nuevo en la seccin dedicada a los entornos de ejecucin.
4.3.2. El directorio de la aplicacin (app)Como vimos en el controlador frontal, la clase AppKerneles el punto de entrada
principal de la aplicacin y es la responsable de toda la configuracin. Como tal,
se almacena en el directorio app/.
-
8/11/2019 Libro Symfony2.4
50/102
Esta clase debe implementar dos mtodos que definen todo lo que Symfony
necesita saber acerca de tu aplicacin. Ni siquiera tienes que preocuparte de
estos mtodos durante el arranque Symfony los rellena por ti con parmetros
predeterminados.
registerBundles(): devuelve un array con todos los bundles necesarios para
ejecutar la aplicacin.
registerContainerConfiguration(): carga el archivo de configuracin de
recursos de la aplicacin (consulta la seccin Configurando la aplicacin).
Durante el desarrollo de una aplicacin, normalmente el directorio app/solo los
utilizas para modificar la configuracin y los archivos de enrutamiento en el
directorio app/config/(consulta la seccinConfigurando la aplicacin).Este directorio tambin contiene el directorio cach de la aplicacin (app/cache), un
directorio de logs(app/logs) y un directorio para archivos de recursos globales,
tales como plantillas (app/Resources). Aprenders ms sobre cada uno de estos
directorios en captulos posteriores.
Carga automticaAl arrancar Symfony, se incluye un archivo especialllamado vendor/autoload.php. Este archivo, creado por Composer, se encarga de
configurar el cargador automtico de clases, que a su vez carga automticamente
todos los archivos de tu aplicacin que se encuentren en el directorio src/y todas
las libreras externas configuradas en el archivo composer.json.
Gracias al cargador automtico, nunca tendrs que preocuparte de usar
declaraciones includeorequire. Esto es posible porque Composer
utiliza namespaceo espacio de nombres de una clase para determinar su
ubicacin y as incluye automticamente el archivo en el instante en que necesitas
una clase.
El cargador automtico ya est configurado para buscar cualquiera de tus clasesPHP en el directorio src/. Para que funcione la carga automtica, el nombre de la
clase y la ruta del archivo deben seguir el mismo patrn:
Nombre de la clase: Acme\HelloBundle\Controller\HelloController
-
8/11/2019 Libro Symfony2.4
51/102
Ruta fsica del
archivo: src/Acme/HelloBundle/Controller/HelloController.php
4.3.3. El directorio fuente (src)
En pocas palabras, el directorio src/contiene todo el cdigo real (cdigo PHP,
plantillas, archivos de configuracin, estilos, etc.) que pertenece a tu aplicacin.
De hecho, al programar una aplicacin Symfony, la mayor parte de tu trabajo se
llevar a cabo dentro de uno o ms bundles creados en este directorio.
Pero, qu es exactamente un bundle?
4.4.El sistema de bundles
Un bundle es un concepto similar al de los plugins en otras aplicaciones, perotodava mejor. La diferencia clave es que en Symfony2 todoes un bundle,
incluyendo tanto la funcionalidad bsica de la plataforma como el cdigo escrito
para tu aplicacin.
Los bundles son la parte ms importante de Symfony2. Permiten utilizar
funcionalidades construidas por terceros o empaquetar tus propias funcionalidades
para distribuirlas y reutilizarlas en otros proyectos. Adems, facilitan mucho la
activacin o desactivacin de determinadas caractersticas dentro de una
aplicacin.
NOTAEn esta seccin solo se va a explicar lo bsico, pero hay un captulo
dedicado completamente al tema de los bundles.
Un bundle simplemente es un conjunto estructurado de archivos que se
encuentran en un directorio y que implementan una sola caracterstica. Puedes
crear por ejemplo un BlogBundle, un ForoBundleo un bundle para gestionar
usuarios (muchos de ellos ya existen como bundles de software libre). Cada
directorio contiene todo lo relacionado con esa caracterstica, incluyendo archivosPHP, plantillas, hojas de estilo, archivos Javascript, tests y cualquier otra cosa
necesaria.
Las aplicaciones Symfony se componen de bundles, tal como se define en el
mtodoregisterBundles()de la clase AppKernel:
// app/AppKernel.php
-
8/11/2019 Libro Symfony2.4
52/102
publicfunctionregisterBundles()
{
$bundles=array(
newSymfony\Bundle\FrameworkBundle\FrameworkBundle(),
newSymfony\Bundle\SecurityBundle\SecurityBundle(),
newSymfony\Bundle\TwigBundle\TwigBundle(),
newSymfony\Bundle\MonologBundle\MonologBundle(),
newSymfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
newSymfony\Bundle\DoctrineBundle\DoctrineBundle(),
newSymfony\Bundle\AsseticBundle\AsseticBundle(),
newSensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
);
if(in_array($this->getEnvironment(),array('dev','test'))){
$bundles[]=new Acme\DemoBundle\AcmeDemoBundle();
$bundles[]=newSymfony\Bundle\WebProfilerBundle\WebProfilerBundle(
);
$bundles[]=newSensio\Bundle\DistributionBundle\SensioDistributionBundle();
$bundles[]=newSensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
}
return$bundles;
}
Con el mtodo registerBundles(), puedes controlar completamente los bundles
que utiliza tu aplicacin, incluso aquellos bundles que forman el ncleo del
framework.
-
8/11/2019 Libro Symfony2.4
53/102
TRUCOUn bundle se puede encontrar en cualquier directorio, siempre y cuando
Symfony2 lo pueda cargar automticamente (con el autocargador configurado
en app/autoload.php).
4.4.1. Creando un bundleLa edicin estndar de Symfony incluye un comando para crear bundles
totalmente funcionales de una manera muy sencilla. Por supuesto, tambin
puedes crear los bundles a mano si lo prefieres.
Para mostrarte lo sencillo que es el sistema de bundles, vamos a crear a mano y
activar un nuevo bundle llamado AcmeTestBundle.
TRUCOLa parte Acmees slo un nombre ficticio que debes sustituir por el nombre
del proveedor del bundle, es decir, el nombre o siglas de tu empresa (porejemplo, ABCTestBundlesi la empresa se llama ABC). Si es un bundle personal,
puedes utilizar tu nombre completo o las iniciales.
En primer lugar, crea un directorio src/Acme/TestBundle/ y aade un nuevo archivo
llamadoAcmeTestBundle.php ::
// src/Acme/TestBundle/AcmeTestBundle.php
namespaceAcme\TestBundle;
useSymfony\Component\HttpKernel\Bundle\Bundle;
classAcmeTestBundle extendsBundle
{
}
TRUCOEl nombre AcmeTestBundlesigue las convenciones estndar denomenclatura de bundles. Tambin puedes optar por acortar el nombre del bundle
simplemente a TestBundleal nombrar esta clase TestBundle(y el nombre del
archivo TestBundle.php).
-
8/11/2019 Libro Symfony2.4
54/102
Esta clase vaca es lo nico que necesitamos para crear nuestro nuevo bundle.
Aunque normalmente est vaca, esta clase te permite personalizar el
comportamiento del bundle.
Ahora que hemos creado nuestro bundle, tenemos que activarlo a travs de laclase AppKernel:
// app/AppKernel.php
publicfunctionregisterBundles()
{
$bundles=array(
...,
// registra tus bundles
newAcme\TestBundle\AcmeTestBundle(),
);
// ...
return$bundles;
}
Aunque todava no hace nada, el bundle AcmeTestBundleya est listo para
utilizarlo.
Generar un bundle a mano es bastante sencillo, pero Symfony tambin
proporciona un comando para generar la estructura bsica del bundle:
php app/console generate:bundle --namespace=Acme/TestBundle
Como resultado este comando genera el esqueletodel bundle formado por un
controlador bsico, la plantilla y la configuracin del enrutamiento. Ms adelante
se explica en detalle la consola de comandos de Symfony2.
-
8/11/2019 Libro Symfony2.4
55/102
TRUCOCuando crees un nuevo bundle o uses un bundle de terceros, asegrate
siempre de habilitar el bundle en el mtodo registerBundles(). El
comando generate:bundlese encarga de hacerlo automticamente.
4.4.2. Estructura de directorios de un bundleLa estructura de directorios de un bundle es simple y flexible. Por defecto el
sistema de bundles sigue una serie de convenciones que ayudan a mantener el
cdigo consistente entre todos los bundles Symfony2. Echa un vistazo
a AcmeHelloBundle, ya que contiene algunos de los elementos ms comunes de un
bundle:
Controller/: contiene los controladores del bundle (por
ejemplo, HelloController.php).
DependencyInjection/: contiene elementos relacionados con el contenedor de
inyeccin de dependencias, un concepto muy avanzado que se explicar ms
adelante. Entre otras, contiene las extensiones para las clases de inyeccin
de dependencias, la configuracin que importan los servicios y registra uno o
ms pases del compilador (este directorio no es obligatorio).
Resources/config/: contiene la configuracin, incluyendo la configuracin de
enrutamiento (por ejemplo, routing.yml).
Resources/views/: contiene las plantillas organizadas segn el nombre del
controlador (por ejemplo, Hello/index.html.twig).
Resources/public/: contiene recursos web (imgenes, hojas de estilo, etc.) y
es copiado o enlazado simblicamente al directorio web/del proyecto con el
comando assets:install.
Tests/: tiene los tests unitarios y funcionales del bundle.
Un bundle puede ser tan pequeo o tan grande como sea necesario.
A medida que avances en el libro, aprenders cmo persistir objetos a una base
de datos, crear y validar formularios, crear traducciones para tu aplicacin, escribir
tests y mucho ms. Cada uno de estos tiene su propio lugar y rol dentro del
bundle.
-
8/11/2019 Libro Symfony2.4
56/102
4.5.Configurando la aplicacinLa aplicacin est formada por una coleccin de bundles que representan todas
las caractersticas y capacidades de tu aplicacin. Cada bundle se puede
personalizar a travs de archivos de configuracin escritos en YAML, XML o PHP.
De forma predeterminada, el archivo de configuracin principal se encuentra en el
directorio app/config/y se llama config.yml, config.xmlo config.phpen funcin
del formato que prefieras:
YAML
XML
PHP# app/config/config.yml
imports:
- { resource: parameters.yml }
- { resource: security.yml }
framework:
secret: "%secret%"
router: {resource: "%kernel.root_dir%/config/routing.yml"}
# ...
# Twig Configuration
twig:
debug: "%kernel.debug%"
strict_variables: "%kernel.debug%"
# ...
NOTAAprenders cmo cargar cada archivo y formato en la siguiente seccin
dedicada a los entornos de ejecucin.
http://librosweb.es/symfony_2_4/capitulo_4/configurando_la_aplicacion.html#select_tab_1_eba45http://librosweb.es/symfony_2_4/capitulo_4/configurando_la_aplicacion.html#select_tab_1_eba45http://librosweb.es/symfony_2_4/capitulo_4/configurando_la_aplicacion.html#select_tab_2_eba45http://librosweb.es/symfony_2_4/capitulo_4/configurando_la_aplicacion.html#select_tab_2_eba45http://librosweb.es/symfony_2_4/capitulo_4/configurando_la_aplicacion.html#select_tab_3_eba45http://librosweb.es/symfony_2_4/capitulo_4/configurando_la_aplicacion.html#select_tab_3_eba45http://librosweb.es/symfony_2_4/capitulo_4/configurando_la_aplicacion.html#select_tab_3_eba45http://librosweb.es/symfony_2_4/capitulo_4/configurando_la_aplicacion.html#select_tab_2_eba45http://librosweb.es/symfony_2_4/capitulo_4/configurando_la_aplicacion.html#select_tab_1_eba45 -
8/11/2019 Libro Symfony2.4
57/102
Cada opcin de nivel superior como frameworko twigdefine la configuracin de un
bundle especfico. Por ejemplo, la clave frameworkdefine la configuracin para el
ncleo de Symfony FrameworkBundlee incluye la configuracin de enrutamiento,
plantillas, y otros elementos del ncleo.
No te preocupes por el momento de las opciones de configuracin especficas de
cada seccin, ya que el archivo de configuracin viene con parmetros
predeterminados. A medida que leas y explores ms cada parte de Symfony2,
aprenders sobre las opciones de configuracin especficas de cada
caracterstica.
Formatos de configuracinA lo largo de los captulos, todos los ejemplos deconfiguracin muestran los tres formatos (YAML, XML y PHP). Cada uno tiene sus
propias ventajas y desventajas. T eliges cual utilizar:
YAML: sencillo, limpioy fcil de leer.
XML: ms poderoso que YAML y permite el autocompletado del IDE.
PHP: el ms potente, pero menos fcil de leer que los formatos de
configuracin estndar.
4.5.1. Obteniendo la configuracin por defectoEl nuevo comando config:dump-referencete permite volcar a la consola toda la
configuracin por defecto de un bundleen formato YAML. El siguiente ejemplo
muestra cmo volcar la configuracin delbundleFrameworkBundle:
$ app/console config:dump-reference FrameworkBundle
En vez de el nombre completo del bundle, tambin puedes utilizar el nombre de su
opcin de configuracin principal:
$ app/console config:dump-reference framework
4.6.EntornosUna aplicacin puede funcionar en diversos entornos. Los diferentes entornos
comparten el mismo cdigo PHP (solo es diferente el controlador frontal), pero
usan una configuracin diferente. Por ejemplo, un entorno de
desarrollo devguarda las advertencias y errores, mientras que un entorno de
-
8/11/2019 Libro Symfony2.4
58/102
produccin prodslo registra los errores. Algunos archivos se vuelven a generar
en cada peticin en el entorno dev(para mayor comodidad de los desarrolladores),
pero se cachean en el entorno prod. Todos los entornos se encuentran en la
misma mquina y ejecutan la misma aplicacin.
Un proyecto Symfony2 normalmente comienza con tres entornos
(dev, testy prod), aunque resulta sencillo crear nuevos entornos. Puedes ver tu
aplicacin en diferentes entornos con slo cambiar el controlador frontal en tu
navegador. Para ver la aplicacin en el entorno dev, accede a la aplicacin a
travs del controlador frontal de desarrollo:
http://localhost/app_dev.php/hello/Ryan
Si deseas ver cmo se comportar tu aplicacin en el entorno de produccin,
utiliza en su lugar el controlador frontal prod:
http://localhost/app.php/hello/Ryan
Como el entorno prodest optimizado para ser muy rpido, la configuracin, el
enrutamiento y las plantillas Twig se compilan en clases PHP simples y se
guardan en cach.
Si haces cualquier cambio en las plantillas, no lo vers en el entorno proda menos
que borres la cache de la aplicacin y as fuerces a Symfony a volver a compilar
las plantillas. Para borrar la cache del entorno de produccin, ejecuta el siguientecomando de consola:
php app/console cache:clear --env=prod --no-debug
NOTASi abres el archivo web/app.php, vers que est configurado explcitamente
para usar el entorno prod:
$kernel=newAppKernel('prod',false);
Puedes crear un nuevo controlador frontal para un nuevo entorno copiando el
archivo y cambiandoprodpor algn otro valor.
NOTAEl entorno testse utiliza cuando se ejecutan tests automticas y no se
puede acceder directamente a travs del navegador. Consulta el captulo dedicado
a los tests para obtener ms informacin.
-
8/11/2019 Libro Symfony2.4
59/102
4.6.1. Configurando entornos
La clase AppKerneles realmente la responsable de cargar el archivo de
configuracin segn el controlador que utilices:
// app/AppKernel.php
publicfunction registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
}
Ya sabes que la extensin .ymlse puede cambiar a .xmlo .phpsi prefieres usar
XML o PHP para escribir tu configuracin. Adems, observa que cada entorno
carga su propio archivo de configuracin. Considera el archivo de configuracinpara el entorno dev.
YAML
XML
PHP# app/config/config_dev.yml
imports:
- { resource: config.yml }
framework:
router: {resource: "%kernel.root_dir%/config/routing_dev.yml"}
profiler: {only_exceptions: false }
# ...
La clave importses similar a una declaracin includede PHP y garantiza que en
primer lugar se carga el archivo de configuracin principal (config.yml). El resto
del archivo de configuracin predeterminado simplemente aumenta el nmero de
eventos que se registran en el log y realiza otros ajustes tiles para un entorno de
desarrollo.
http://librosweb.es/symfony_2_4/capitulo_4/entornos.html#select_tab_1_ebb7chttp://librosweb.es/symfony_2_4/capitulo_4/entornos.html#select_tab_1_ebb7chttp://librosweb.es/symfony_2_4/capitulo_4/entornos.html#select_tab_2_ebb7chttp://librosweb.es/symfony_2_4/capitulo_4/entornos.html#select_tab_2_ebb7chttp://librosweb.es/symfony_2_4/capitulo_4/entornos.html#select_tab_3_ebb7chttp://librosweb.es/symfony_2_4/capitulo_4/entornos.html#select_tab_3_ebb7chttp://librosweb.es/symfony_2_4/capitulo_4/entornos.html#select_tab_3_ebb7chttp://librosweb.es/symfony_2_4/capitulo_4/entornos.html#select_tab_2_ebb7chttp://librosweb.es/symfony_2_4/capitulo_4/entornos.html#select_tab_1_ebb7c -
8/11/2019 Libro Symfony2.4
60/102
Ambos entornos (prody test) siguen el mismo modelo: cada uno importa el
archivo de configuracin bsico y luego modifica sus valores de configuracin para
adaptarlos a las necesidades especficas del entorno. Esto es slo una
convencin, pero te permite reutilizar la mayor parte de tu configuracin y
personalizar slo algunas opciones especficas.
4.7.ResumenEnhorabuena! Ahora ya conoces todos los aspectos fundamentales de Symfony2
y has descubierto lo fcil y flexible que puede ser. Aunque todava faltan muchas
caractersticas por explicar, asegrate de haber entendido bien los siguientes
puntos bsicos:
La creacin de una pgina es un proceso de tres pasos que requiere de
una ruta, uncontroladory (opcionalmente) una plantilla.
Cada proyecto contiene slo unos cuantos directorios
principales: web/(recursos web y controladores
frontales), app/(configuracin), src/(tus bundles), y vendor/(cdigo de
terceros). Tambin existe un directorio bin/que se utiliza para ayudarte a
actualizar las libreras de terceros.
Cada caracterstica de Symfony2 (incluyendo su propio ncleo) est
desarrollada con un bundle, que es un conjunto estructurado de archivos para
esa caracterstica.
La configuracinde cada bundle se encuentra en el directorio app/configy
se puede escribir en YAML, XML o PHP.
Cada entornoes accesible a travs de un controlador frontal diferente (por
ejemplo, app.phpyapp_dev.php) el cual a su vez carga un archivo de
configuracin diferente.
A partir de aqu, cada captulo explica conceptos ms avanzados de Symfony y
algunas de sus herramientas ms poderosas. Cuanto ms sepas sobre Symfony2,
ms apreciars la flexibilidad de su arquitectura y el poder que te proporciona para
desarrollar aplicaciones rpidamente.
-
8/11/2019 Libro Symfony2.4
61/102
Captulo 5.El controladorUn controlador es una funcin PHP creada por ti y que se encarga de obtener la
informacin de la peticin HTTP y de generar y devolver la respuesta HTTP (en
forma de objeto de tipo Responsede Symfony2). La respuesta puede ser una
pgina HTML, un documento XML, un array JSON serializado, una imagen, una
redireccin a otra pgina, un error de tipo 404 o cualquier otra cosa que se te
ocurra. El controlador contiene toda la lgica que tu aplicacin necesita para
generar el contenido de la pgina.
Para ver lo sencillo que es esto, echemos un vistazo a un controlador real de
Symfony2. El siguiente controlador genera una pgina que simplemente
imprime Hello world!:
useSymfony\Component\HttpFoundation\Response;
publicfunctionhelloAction()
{
returnnewResponse('Hello world!');
}
El objetivo de un controlador siempre es el mismo: crear y devolver unobjeto Response. Para ello, a veces obtiene informacin de la peticin, o busca un
recurso en la base de datos, enva un correo electrnico, o guarda informacin en
la sesin del usuario. Independientemente de lo que haga, el controlador siempre
devuelve un objeto Responseque se utiliza para generar la respuesta que se enva
al usuario.
Como ves ni Symfony se comporta de forma automgicani existe ms requisitos
de los cuales preocuparse. Estos son algunos ejemplos de casos comunes:
Controlador Aprepara un objeto Responseque genera el contenido HTML de
la portada del sitio.
Controlador Blee el parmetro slugde la peticin para cargar una entrada del
blog desde la base de datos y crea un objeto Responsepara mostrar ese blog.
-
8/11/2019 Libro Symfony2.4
62/102
-
8/11/2019 Libro Symfony2.4
63/102
aplicacin tpica tiene un controlador frontal de produccin (por ejemplo, app.php) y
un controlador frontal de desarrollo (por ejemplo, app_dev.php). Probablemente
nunca necesites editar, ver o preocuparte por los controladores frontales en tu
aplicacin.
5.2.Un controlador sencilloA pesar de que un controlador puede ser cualquier cdigo ejecutable PHP (una
funcin, un mtodo en un objeto o un Closure), en Symfony2 un controlador suele
ser un mtodo dentro de un objeto de tipo controlador. Los controlador