Beruflich Dokumente
Kultur Dokumente
if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
'127.0.0.1',
'::1',
))) {
Y recomendaciones como la versin de PHP ms ptima (PHP 5.3.8 o superior), extensin "intl", PHP
eAccelerator:
A continuacin subsanaremos los posibles problemas de configuracin de nuestro servidor con
Apache y PHP, por ejemplo establecer los permisos necesarios para las carpetas:
/var/www/symfony2/app/cache
/var/www/symfony2/app/logs
Con los comandos linux:
sudo chmod 777 /var/www/symfony2/app/cache
sudo chmod 777 /var/www/symfony2/app/cache
Editaremos el fichero de configuracin de PHP para aadir el parmetro "date.timezone" con el
comando linux:
sudo nano /etc/php5/apache2/php.ini
Aadiremos la lnea (o la des comentaremos si ya existe comentada):
date.timezone = Europe/Madrid
(Cambiaremos la zona por la correspondiente)
Modificaremos el parmetro (si existe) "short_open_tag" con el valor "Off" aadiendo o modificando
la lnea (si existe):
short_open_tag = Of
Guardaremos los cambios en el fichero php.ini pulsando Control + O y cerraremos la edicin de
nano pulsando Control + X:
Nos indicar si hemos solucionado los posibles problemas de configuracin, cuando estn todos
solucionados pulsaremos en "Configure your Symfony Application online":
Si vamos a realizar aplicaciones web PHP que accedan a base de datos MySQL, SQLite, PostgreSQL,
Oracle, IBM DB2, o Microsoft SQL Server podremos indicarlo a continuacin, introduciendo los datos
de acceso (usuario, IP, contrasea, ...):
Establecemos el Secreto Global (Global Secret):
El asistente nos indicar que Symfony 2 ya est configurado:
Formato: formato de notacin que usaremos para nuestro proyecto Symfony2, podremos
elegir entre YAML, XML o PHP.
Responderemos a las preguntas que el asistente para crear un nuevo proyecto Symfony2 nos
realizar (crear estructura de directorios, actualizaciones automticas del kernel del bundle,
actualizacin automtica de la ruta (route), etc.:
Route (ruta) en Symfony 2
De forma predeterminada, el archivo de configuracin de enrutamiento en una aplicacin Symfony2
se encuentra en:
.../src/nombre_bundle/Resources/config/routing.yml
Al igual que toda la configuracin en Symfony2, tambin se puede optar por utilizar XML o PHP, por
supuesto el fichero de ruta puede alojarse fuera de la ubicacin por defecto, aunque es conveniente
mantener la estructura estndar recomendada.
El enrutamiento de URLs sirve para generar URLs amigables y ms legibles para el usuario y para
los motores de bsqueda. Por ejemplo, el enrutamiento sirve para cambiar las tpicas URLs:
http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=640
Por URLs ms legibles, amigables y ptimas para el posicionamiento SEO (Search Engine
Optimization):
http://www.ajpdsoft.com/servidor-web-ubuntu-server-12
Adems, el enrutamiento de URLs de Symfony2 nos permitir modificar enlaces de forma sencilla,
enlaces que puedan estar referenciados en varias secciones de nuestra web. Ser suficiente con
cambiar el enlace en el fichero de rutas.
Con el procedimiento anterior Symfony ya habr creado el archivo de ruta "routing.yml" en la
ubicacin predeterminada con el siguiente contenido:
ajpd_soft_acme_hola_mundo_homepage:
pattern: /hello/{name}
defaults: { _controller: AjpdSoftAcmeHolaMundoBundle:Default:index }
Bsicamente la ruta anterior aadida de forma automtica al crear el bundle lo que har ser
ejecutar el controlador "Default", por lo que deber existir un fichero llamado DefaultController.php
en la carpeta /Controller de nuestro bundle, dicha ruta ejecutar el procedimiento o funcin "index"
de dicho controlador, por lo que el fichero DefaultController.php tendr una funcin o procedimiento
llamado "indexAction", tambin pasar el parmetro "name" que ser el texto que se escriba en la
URL despus de "hello". La ruta anterior se ejecutar en un navegador como:
http://..../hello/nombre_escrito_por_usuario
Para realizar las compilaciones en desarrollo se ejecutar la URL:
http://localhost/symfony2/web/app_dev.php/hello/ajpdsoft
Donde cambiaremos "localhost" por la IP o nombre DNS del servidor con Symfony y "symfony2"
ser la ubicacin de Symfony en nuestro servidor web con Apache. "ajpdsoft" ser el texto libre
introducido por el usuario, dicho texto se almacenar en la variable "name".
Existen numerosas opciones para el enrutamiento en Symfony, opciones que no enumeraremos en
este tutorial por ser bastante extensas. Para obtener ms informacin es recomendable consultar la
documentacin oficial de Symfony: rutas con marcadores de posicin, rutas con parmetros
(_controller, _format, _locale) y mtodos (GET, HEAD, POST, PUT, DELETE), rutas a recursos
externos, establecer prefijos para rutas, etc.
Controller (controlador) en Symfony 2
Un controlador (controller) en Symfony es una funcin PHP que obtiene la informacin de la
solicitud (desde la ruta) y devuelve una respuesta HTTP (o un objeto en Symfony2). La respuesta
puede ser una pgina HTML, un documento XML, una matriz JSON serializado, una imagen, una
redireccin, un error 404 o cualquier otra cosa. El controlador puede contiene cualquier lgica
arbitraria que la aplicacin necesite para representar el contenido de una pgina.
El asistente para crear el bundle habr creado un fichero de ejemplo de controlador:
DefaultController.php
En la carpeta:
.../www/symfony2/src/AjpdSoft/AcmeHolaMundoBundle/Controller
Hemos editado el fichero del controlador con un editor de texto plano y hemos aadido el siguiente
contenido:
<?php
namespace AjpdSoft\AcmeHolaMundoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
public function indexAction($name)
{
$params = array('mensaje' => 'Hola Mundo AjpdSoft - Primer proyecto PHP con Symfony2',
'fecha' => date('d-m-yyy'), 'name' => $name);
return $this->render('AjpdSoftAcmeHolaMundoBundle:Default:index.html.twig', $params);
}
}
El controlador anterior ser llamado usando la ruta establecida en el fichero de rutas, como
indicamos aqu. Obtendr algunos datos como la fecha actual del sistema y el valor pasado por la
URL de la ruta y los enviar para ser mostrados en la plantilla "index.html.twing".
Por lo tanto Symfony est perfectamente diseado para la programacin por capas, separando
claramente la lgica de negocio (controller) de la lgica de diseo (template) y de la capa de datos.
Los controladores en Symfony los usaremos para establecer toda la lgica de negocio.
Template (plantilla) en Symfony 2
Las plantillas en symfony permiten separar la capa de lgica de diseo de la de la lgica de negocio
(controlador). En las plantilas podemos aadir toda la presentacin de nuestro sitio web (por
ejemplo, el cdigo HTML) que quedar separado y podrn reutilizarse diferentes partes del diseo
de la pgina. En lugar de escribir el cdigo HTML dentro del controlador (tambin se puede hacer
pero no es recomendable), podremos hacer una plantilla en su lugar.
La plantilla que se crea por defecto usando el asistente, en este paso, es la siguiente:
index.html.twig
Y se aloja en la carpeta:
...www/symfony2/src/AjpdSoft/AcmeHolaMundoBundle/Resources/views/Default
Hemos modificado con un editor de texto plano la plantilla para adaptarla a nuestro sitio web, como
ejemplo de "Hola mundo":
<h1>Hola Mundo - Aplicacion PHP con Symfony </h1>
<h2>Esto es una prueba de proyecto con Symfony.</h2>
<b>Nombre</b>: {{name}}
<b>Fecha</b>: {{fecha}}
<b>Mensaje</b>: {{mensaje}}
El ejemplo de salida de nuestra primera aplicacin PHP con Symfony2, lo compilaremos abriendo un
navegador y accediendo a la URL: http://localhost/symfony2/web/app_dev.php/hello/ajpdsoft
(Cambiaremos "localhost/symfony2" por la IP o nombre DNS de nuestro servidor con Symfony y la
carpeta donde lo hayamos instalado)
fields: en este parmetro indicamos los campos y tipo de datos que queramos establecer
para la entidad y por lo tanto para la tabla de MySQL que posteriormente crearemos.
Doctrine nos mostrar un pequeo asistente para crear la entidad, donde podremos elegir cambiar
el nombre especificado y aadir ms campos. Tambin podremos elegir el tipo de notacin para la
entidad (yml, xml, php o annotation), elegiremos todas las opciones por defecto pulsando INTRO:
Si queremos hacer persistente el objeto entidad "Factura" de Doctrine creado anteriormente en la
base de datos MySQL como una tabla podremos hacerlo de forma automtica ejecutando el
comando:
php app/console doctrine:schema:update --force
Si todo es correcto devolver:
Updating database schema...
Database schema updated successfully! "1" queries were executed
Insertar registros en tabla MySQL con Symfony y Doctrine
Ahora crearemos el controlador (controller) en nuestro proyecto Symfony2 para trabajar con la
entidad Factura, para crear el controller accederemos a la carpeta "Controller" de nuestro proyecto
"Symfony2" y ejecutaremos:
nano FacturaController.php
Aadiremos el siguiente cdigo al controlador, este cdigo insertar una factura, aadir un registro
a la tabla "Factura" de MySQL. Como ejemplo utilizaremos datos fijos, lo lgico sera mostrar un
formulario para que el usuario introdujera los datos, esto lo explicaremos en futuros tutoriales:
<?php
namespace AjpdSoft\AcmeHolaMundoBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use AjpdSoft\AcmeHolaMundoBundle\Entity\Factura;
use Symfony\Component\HttpFoundation\Response;
class FacturaController extends Controller
{
public function insertarfacturaAction()
{
$facturaIns = new Factura();
$facturaIns->setNumero('0001-2013');
$facturaIns->setImporte(1000.87);
$facturaIns->setCodigocliente(1);
$facturaIns->setFecha(new \DateTime("now"));
$em = $this->getDoctrine()->getManager();
$em->persist($facturaIns);
$em->flush();
return new Response('Creada factura ' . $facturaIns->getId());
}
A continuacin explicamos algunas lneas del cdigo:
El resto de lneas las utilizaremos para persistir los datos establecidos para la entidad en la
tabla de MySQL.
Para probar el controlador y el cdigo que insertar un registro en una tabla aadiremos una ruta
en el fichero de rutas de nuestro proyecto Symfony2 (routing.yml), para ello nos situaremos en la
carpeta del fichero de rutas:
cd /www/var/symfony2/src/AjpdSoft/AcmeHolaMundoBundle/Resources/config
Y editaremos el fichero "routing.yml": nano routing.yml
Aadiremos las siguientes lneas:
insertar_factura:
pattern: /insertarfactura
defaults: { _controller: AjpdSoftAcmeHolaMundoBundle:Factura:insertarfactura }
(Teniendo en cuenta que nuestro controlador se llama "Factura" y el procedimiento para insertar
factura del controlador se llama "insertarfacturaAction")
Para probar el resultado ser suficiente con abrir un navegador web y acceder a la URL:
http://ip_servidor_symfony/web/app_dev.php/insertarfactura
Si todo es correcto nos devolver "Creada factura 1":
Mostrar registros de tabla MySQL con Symfony y Doctrine
A continaucin explicaremos cmo mostrar una lista de registros de la base de datos en nuestro
proyecto Symfony2 usando Doctrine. En primer lugar editaremos nuestro fichero de controlador
para las facturas FacturaController.php (creado aqu) y aadiremos la siguiente funcin:
public function listarFacturasAction()
{
$em = $this->getDoctrine()->getManager();
$facturas = $em->getRepository('AjpdSoftAcmeHolaMundoBundle:Factura')->findAll();
return $this->render('AjpdSoftAcmeHolaMundoBundle:Factura:listaFacturas.html.twig',
array('facturas' => $facturas));
}
Crearemos el fichero de plantilla (template), para ello crearemos la carpeta para las plantillas del
controlador "Facturas" con:
mkdir /var/www/symfony2/src/AjpdSoft/AcmeHolaMundoBundle/Resources/views/Factura
Accederemos a la carpeta para la plantilla y la crearemos con: nano listaFacturas.html.twig
Aadiremos el siguiente cdigo HTML para mostrar el array de facturas obtenido desde el
Controller:
<h1>FACTURAS</h1>
<table border="1">
<tr>
<th>Numero</th>
<th>Fecha</th>
<th>Importe</th>
<th>Cliente</th>
</tr>
{% for factura in facturas %}
<tr>
<td>{{ factura.id }}</td>
<td>{{ factura.numero }}</td>
<td>{{ factura.fecha | date('d-m-Y') }}</td>
<td>{{ factura.codigocliente }}</td>
</tr>
{% endfor %}
</table>
Aadiremos la ruta en el fichero de rutas de nuestro proyecto Symfony2:
listar_factura:
pattern: /listafacturas
defaults: { _controller: AjpdSoftAcmeHolaMundoBundle:Factura:listarFacturas }
Y ya podremos probar nuestro controlador para mostrar un listado de las facturas de la base de
datos MySQL con Symfony y Doctrine:
Ahora crearemos una tabla en MySQL de forma "manual", sin usar Doctrine, para ello accederemos
por ejemplo con MySQL Administrator y crearemos la tabla "Cliente", con los campos: id, nombre y
cif:
Ahora explicaremos cmo actualizar las entidades existentes y cmo regenerar las nuevas usando
Doctrine. Desde la carpeta de la instalacin de Symfony2 ejecutaremos:
php app/console doctrine:mapping:convert xml
.../symfony2/src/AjpdSoft/AcmeHolaMundoBundle/Resources/config/doctrine/metadata/orm --fromdatabase --force
(Donde ".../symfony2/src/AjpdSoft/AcmeHolaMundoBundle" ser la carpeta de nuestro proyecto
Symfony2)
Si todo es correcto (los datos de conexin a la BD y la ubicacin de las carpetas) Doctrine nos
mostrar el resultado de la recarga de las entidades, habr accedido a la base de datos
especificada en el fichero de parmetros "parameters.yml", habr recorrido todas las tablas y todos
los campos y habr generado un fichero xml por cada entidad (tabla):
Processing entity "Cliente"
Processing entity "Factura"
Exporting "xml" mapping information to
".../symfony2/src/AjpdSoft/AcmeHolaMundoBundle/Resources/config/doctrine/metadata/orm"
Los ficheros generados:
Por ltimo ejecutaremos los siguientes comandos Doctrine para crear los ficheros de entidades en
nuestro proyecto Symfony2 con formato "annotation":
php app/console doctrine:mapping:import AjpdSoftAcmeHolaMundoBundle annotation
php app/console doctrine:generate:entities AjpdSoftAcmeHolaMundoBundle
(Indicando siempre el nombre del bundle de nuestro proyecto Symfony2)
Doctrine habr generado en nuestro caso dos ficheros PHP correspondientes a las dos entidades
Factura y Cliente que a su vez se corresponden con las tablas Cliente y Factura de MySQL:
Habr aadido todos los mtodos get y set para cada campo de cada tabla de la base de datos: