php bitter sweet symfony!

33
Desarrollo de una Micro-Red-Social con Symfony Ricard Luquero ([email protected]) CTO de Construmatica.com (Grupo Intercom) Aldo Chiecchia ([email protected]) Desarrollador web para Atrapalo.com php | Bitter Sweet Symfony!

Upload: ricard-luquero

Post on 20-Jun-2015

4.154 views

Category:

Technology


6 download

DESCRIPTION

Desarrollo de una Micro-Red-Social con Symfony

TRANSCRIPT

Page 1: Php Bitter Sweet Symfony!

Desarrollo de una Micro-Red-Social con Symfony

Ricard Luquero ([email protected])CTO de Construmatica.com (Grupo Intercom)

Aldo Chiecchia ([email protected])Desarrollador web para Atrapalo.com

php | Bitter Sweet Symfony!

Page 2: Php Bitter Sweet Symfony!

Presentación de la práctica

Desarrollo de una micro-red-social presentando las principales características de

Symfony

Page 3: Php Bitter Sweet Symfony!

Sumario

• Instalación y configuración• ¿Cómo va a ser nuestra MSN?• Creación del modelo de datos• Primeros pasos en el MVC

Page 4: Php Bitter Sweet Symfony!

Punto de partida

Esta práctica está basada en el• "My first symfony project" 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.

Page 5: Php Bitter Sweet Symfony!

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

Page 6: Php Bitter Sweet Symfony!

Instalación y configuración (2)

• Descargamos la sandbox• La descomprimimos en el root del webserver (Apache)• La renombramos como "msn" (micro-s...)• Validamos la ruta: http://localhost/msn/web, donde

debería aparecernos algo parecido a esto:

Page 7: Php Bitter Sweet Symfony!

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

Page 8: Php Bitter Sweet Symfony!

¿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.

Page 9: Php Bitter Sweet Symfony!

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/

Page 10: Php Bitter Sweet Symfony!

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.

Page 11: Php Bitter Sweet Symfony!

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.

Page 12: Php Bitter Sweet Symfony!

Creación del modelo de datos (4)

Page 13: Php Bitter Sweet Symfony!

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 batch\create_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

Page 14: Php Bitter Sweet Symfony!

Importación de los datos de prueba

Preparamos un archivo con los datos de prueba para nuestra red:/data/fixtures/test_data.ymlUser:aldo:username: zimfirst_name: Aldolast_name: Chiecchiadescription: Desarrollador web para Atrapalo.com

...  (disponible en el msn_pack.zip)

Page 15: Php Bitter Sweet Symfony!

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

Page 16: Php Bitter Sweet Symfony!

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

Page 17: Php Bitter Sweet Symfony!

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.ymlhomepage:url: /param: { module: user, action: index }

Vacíamos la caché:symfony cc

Page 18: Php Bitter Sweet Symfony!

Configuración de la home

Renombramos el archivo indexSuccess.php a listSuccess.php y creamos una redirección interna de la acción "index" a la acción "list" 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.phppublic function executeIndex() {$this->forward('user', 'list');}

public function executeList() {}

Page 19: Php Bitter Sweet Symfony!

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.

Page 20: Php Bitter Sweet Symfony!

Dejando la home presentable

Le damos algo de "vidilla" 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 "remix" 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

Page 21: Php Bitter Sweet Symfony!

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="menu"><ul><li><?php echo link_to('home', '@homepage', 'class=current'); ?></li><li><a href="#">sign-in</a></li><li><a href="#">login/logout</a></li></ul></div>

Page 22: Php Bitter Sweet Symfony!

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)

Dejando la home presentable (3)

Page 23: Php Bitter Sweet Symfony!

/apps/frontend/modules/user/actions/actions.class.php$this->users = BaseUserPeer::doSelect(new Criteria());

/apps/frontend/modules/user/templates/listSuccess.php<ul><?php foreach ($users as $user): ?><li><?php echo link_to($user->getFirstName() . ' ' . $user->getLastName(), 'user/show?id=' . $user->getId()); ?></li><?php endforeach; ?></ul>

Trabajando con el View / Controller

Page 24: Php Bitter Sweet Symfony!

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 ();    }

El Model entra en acción

Page 25: Php Bitter Sweet Symfony!

Nos damos un pequeño paseo por el view.yml para configurar el título y vor sus opciones.

/apps/frontend/config/view.ymldefault:http_metas:content-type: text/html

metas:title: MSN - Micro Social Networkrobots: index, followdescription: symfony projectkeywords: symfony, project....

Paseo por el view.yml

Page 26: Php Bitter Sweet Symfony!

Lo que nos queda por ver es como trabajar más detalladamente con la estructura de Symfony. Los "slides" 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.

Dando unos pasos más

Page 27: Php Bitter Sweet Symfony!

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);

(...)

/apps/frontend/modules/user/actions/actions.class.php

Page 28: Php Bitter Sweet Symfony!

(...)    // 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);}

/apps/frontend/modules/user/actions/actions.class.php (2)

Page 29: Php Bitter Sweet Symfony!

<h2>Profile</h2><ul>    <li><strong>First name:</strong> <?php echo $user->getFirstName(); ?></li>    <li><strong>Last name:</strong> <?php echo $user->getLastName(); ?></li>    <li><strong>Username:</strong> <?php echo $user->getUsername(); ?></li>    <li><strong>Description:</strong><br/><?php echo $user->getDescription(); ?></li></ul>

(...)

/apps/frontend/modules/user/templates/showSuccess.php

Page 30: Php Bitter Sweet Symfony!

(...)<h2>Friends</h2><ul>   <?php foreach ($relations as $relation): ?>     <?php     if ($relation->getRequesterId() == $user->getId())       $friend = $relation->getUserRelatedByReceiverId ();     else       $friend = $relation->getUserRelatedByRequesterId ();     ?>     <li><?php echo link_to ($friend, 'user/show?id=' . $friend->getId()); ?></li>   <?php endforeach; ?></ul>

(...)

/apps/frontend/modules/user/templates/showSuccess.php (2)

Page 31: Php Bitter Sweet Symfony!

(...)<h2>Message area</h2><ul>    <?php foreach ($messages as $message): ?>     <li>       <?php echo $message->getContent(); ?><br/>         <span class="date"><?php echo $message->getCreatedAt(); ?></span> -           <?php echo link_to($message->getUserRelatedBySenderId(), 'user/show?id=' .                $message->getSenderId(), 'class=grey'); ?>         <br/><br/>     </li>   <?php endforeach; ?></ul>

/apps/frontend/modules/user/templates/showSuccess.php (3)

Page 32: Php Bitter Sweet Symfony!

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.

Conclusiones

Page 33: Php Bitter Sweet Symfony!

Este taller fue presentado en el marco de la primera Barcelona PHP Workshop en junio de 2008.

Créditos