De Código a Ejecución: El Papel Fundamental del MSIL en .NET
Php Bitter Sweet Symfony!
1. php | Bitter Sweet Symfony!
Desarrollo de una Micro-Red-Social con Symfony
Ricard Luquero (rluquero@gmail.com)
CTO de Construmatica.com (Grupo Intercom)
Aldo Chiecchia (zimage@tiscali.it)
Desarrollador web para Atrapalo.com
2. Presentación de la práctica
Desarrollo de una micro-red-social
presentando las principales características de
Symfony
3. Sumario
• Instalación y configuración
• ¿Cómo va a ser nuestra MSN?
• Creación del modelo de datos
• Primeros pasos en el MVC
4. Punto de partida
Esta práctica está basada en el
• quot;My first symfony projectquot; que puede
encontrarse en la home de Symfony:
http://www.symfony-project.org
Esa práctica constituye una muy buena primera toma de
contacto con Symfony. Nosotros vamos a repasarla
realizando ciertas modificaciones para enriquecerla.
Para conocer más al detalle el framework, aun más
recomendable es el Tutorial de Askeet.
5. Instalación y configuración
Es mucho más que recomendable la
instalación de Symfony mediante PEAR,
pero para nuestra práctica vamos a
descargar la sandbox ya que nos interesa
centrarnos en otros aspectos del framework.
Symfony Home > Installation
6. Instalación y configuración (2)
• Descargamos la sandbox
• La descomprimimos en el root del webserver (Apache)
• La renombramos como quot;msnquot; (micro-s...)
• Validamos la ruta: http://localhost/msn/web, donde debería
aparecernos algo parecido a esto:
7. Estructura del proyecto
Es el momento de echar un vistazo a la
estructura del proyecto.
Prestamos especial atención a los directorios:
/apps
/apps/frontend
/apps/frontend/modules
/apps/frontend/templates
/lib
/lib/model
/web
8. ¿Cómo va a ser nuestra MSN?
Las expectativas en cuanto a la prestaciones
de nuestra micro red no son muy altas, nos
conformaremos con una aplicación que sea
capaz de:
• Mostrar el listado de usuarios
• Mostrar la información de un usuario en
particular
• Ver las relaciones de amistad entre
usuarios
• Ver los mensajes que se envían los
usuarios.
9. Creación del modelo de datos
Lo que nos interesa en última instancia es disponer
del modelo de datos en XML, así que podemos
crearlo directamente o bien diseñarlo con alguna
herramienta gráfica.
Nosotros hemos optado por el uso de una
herramienta gráfica si bien se ofrece el XML final
para agilizar este paso.
Para el diseño del modelo usaremos DBDesigner
que puede descargarse de:
http://www.fabforce.net/dbdesigner4/
10. Creación del modelo de datos (2)
Durante el proceso necesitaremos
transformar el 'ugly XML' de DBDesigner en
un 'nice XML' listo para ser procesado por
Symfony.
11. Creación del modelo de datos (3)
Para poder realizar esta transformación diponemos de un
pequeño script que deberemos copiar junto con la librería que
requiere. (se pueden encontrar en el msn_pack.zip)
/batch/create_schema.php
/batch/lib/dbd2propel.xsl
Es necesario que PHP disponga de la extensión XSL.
• En Linux puede instalarse mediante:
yum install php-xml / apt-get install php5-xsl
• En Windows será necesasrio activar la extensión XSL de
PHP si no está activada.
13. Creación del modelo de datos (4)
Teniendo en cuenta que tenemos el archivo:
/config/dbdesigner_msn.xml
(creado con DBDesigner, pero puede encontrare en el msn_pack.zip)
ejecutamos el script:
php batchcreate_schema.php
que nos creará el archivo:
/config/schema.xml
(disponible también en el msn_pack.zip)
Nota: Debemos asegurarnos de haber eliminado el archivo: /config/schema.yml
14. Importación de los datos de prueba
Preparamos un archivo con los datos de
prueba para nuestra red:
/data/fixtures/test_data.yml
User:
aldo:
username: zim
first_name: Aldo
last_name: Chiecchia
description: Desarrollador web para Atrapalo.com
...
(disponible en el msn_pack.zip)
15. Ejecución del comando mágico
En este momento disponemos del
schema.xml y de los datos del juego de
pruebas test_data.yml así que ya podemos
ejecutar el comando mágico:
symfony propel-build-all-load frontend
16. Creación de los módulos
Para poder disponer de un módulo sobre el
que trabajar y poder empezar a ver algo de
nuestra aplicación deberemos crearlo con el
comando que Symfony pone a nuestra
disposición:
symfony init-module frontend user
17. Configuración inicial del routing
Necesitamos modificar la página principal de
nuestra aplicación para que apunte al nuevo
módulo que hemos creado.
/apps/frontend/config/routing.yml
homepage:
url: /
param: { module: user, action: index }
Vacíamos la caché:
symfony cc
18. Configuración de la home
Renombramos el archivo indexSuccess.php a
listSuccess.php y creamos una redirección interna de la
acción quot;indexquot; a la acción quot;listquot; ya que inicialmente
mostraremos en la home el listado de usuarios de la
red.
Nuestra acción quedará así:
/apps/frontend/modules/user/actions/actions.class.php
public function executeIndex() {
$this->forward('user', 'list');
}
public function executeList() {}
19. Configuración de la home (2)
Para poder ver que realmente estamos avanzando,
vamos a editar el template que se muestra en la
homepage de nuestra aplicación:
/apps/modules/user/templates/listSuccess.php
<h1>User list</h1>
y revisitamos nuestra home.
20. Dejando la home presentable
Le damos algo de quot;vidillaquot; a la home mediante una
plantilla obtenida en http://www.oswd.org/
• Copiamos el contenido de template_oswd/css/sytle.css* en
nuestro /web/css/main.css
• Copiamos el directorio template_oswd/img* y a /web/img
eliminamos el directorio /web/images que venía con la sandbox.
• Hacemos un quot;remixquot; con el template_oswd/index.htm* y el
template principal de nuestra aplicación
(/apps/frontend/templates/layout.php) conservando obviamente
la línea:
<?php echo $sf_data->getRaw('sf_content') ?>
* todos estos archivos pueden encontrarse en el msn_pack.zip
21. Dejando la home presentable (2)
Modoficamos ligeramente el layout.php para que
sea capaz de redirigir a la home.
/apps/modules/user/templates/listSuccess.php
<h2><?php echo link_to('Micro-Social-Network', '@homepage'); ?></h2>
<div id=quot;menuquot;>
<ul>
<li><?php echo link_to('home', '@homepage', 'class=current'); ?></li>
<li><a href=quot;#quot;>sign-in</a></li>
<li><a href=quot;#quot;>login/logout</a></li>
</ul>
</div>
22. Dejando la home presentable (3)
Revisamos como va quedando nuestra home:
http://localhost/msn/web
Bueno, estoy ya va tomando algo de forma, vamos
a preparar ahora el listado de usuarios:
• Recuperando el listado desde el action
(controller)
• Mostrando el listado desde el template
(view)
24. El Model entra en acción
Observamos que en la anterior acción el código
relacionado con la obtenición del nombre de usuario
no es el mas adecuado dentro de una estructura
MVC, así que hacemos entrar en acción al model:
/lib/model/User.php
public function __toString () {
return $this->getFirstName () . ' ' . $this->getLastName ();
}
25. Paseo por el view.yml
Nos damos un pequeño paseo por el view.yml para
configurar el título y vor sus opciones.
/apps/frontend/config/view.yml
default:
http_metas:
content-type: text/html
metas:
title: MSN - Micro Social Network
robots: index, follow
description: symfony project
keywords: symfony, project
....
26. Dando unos pasos más
Lo que nos queda por ver es como trabajar más
detalladamente con la estructura de Symfony. Los
quot;slidesquot; que quedan muestran únicamente el
contenido de los 2 archivos que nos permiten
disponer de algo más de interactividad en nuestras
páginas.
En el controlador de acciones añadiremos una
nueva función: executeShow que muestra la
información específica de usuarios y crearemos
también un nuevo template para visualizar esa
acción.
27. /apps/frontend/modules/user/actions/actions.class.php
public function executeShow() {
$userId = $this->getRequestParameter('id');
$this->user = UserPeer::retrieveByPk($userId);
$this->forward404Unless($this->user);
// Se obtienen todos los enviados al usuario (es decir donde él es el receptor)
$c = new Criteria();
$c->add(MessagePeer::RECEIVER_ID, $userId);
$c->addDescendingOrderByColumn(MessagePeer::CREATED_AT);
$this->messages = MessagePeer::doSelect($c);
(...)
28. /apps/frontend/modules/user/actions/actions.class.php (2)
(...)
// Se obtienen todas las relaciones en las que está el usuario, pero únicamente
// las que han sido confirmadas
$c = new Criteria();
$c->addJoin(RelationPeer::STATUS_ID, StatusPeer::ID);
$criterion = $c->getNewCriterion(RelationPeer::REQUESTER_ID, $userId);
$criterion->addOr($c->getNewCriterion(RelationPeer::RECEIVER_ID, $userId));
$criterion->addAnd($c->getNewCriterion(StatusPeer::NAME, 'accepted'));
$c->add($criterion);
$this->relations = RelationPeer::doSelect($c);
}
32. Conclusiones
Hemos visto algunas de las funcionalidades básicas
que ofrece Symfony, desde la generación de las
clases asociadas a las tablas de la base de datos,
pasando por el uso de Propel y las manera en la
que podemos navegar por todas las relaciones
entre objetos de forma fácil.
33. Créditos
Este taller fue presentado en el marco de la primera
Barcelona PHP Workshop en junio de 2008.