Jobeet, Día 3: El Modelo De Datos

Symfony

Una vez teniendo claro lo que queremos hacer nos vamos a poner con el modelo de datos. Creando un buen modelo desde el principio será muy útil para no tener que andar modificando la base de datos en mitad del desarrollo con sus consecuentes problemas.

El modelo Relacional

Las entidades de nuestra aplicación seran Job (puestos de trabajo), Affillate (Afiliados) y Category(Categorías) Lo que nos dará un modelo relacional como este.

Jobbet, modelo relacionalAdemás de las columnas descritas en los casos de uso, también añadimos un campo created_at y updated_at a algunas tablas, a diferencia de Symfony 1.4, Symfony2 no rellenará automáticamente estos campos con los valores adecuados por lo que tenemos que indicar en cada entidad que lo haga  o instalar un bundle para que sea automático.

El esquema

Para almacenar los puestos de trabajo, los afiliados, y las categorías, es evidente que necesitamos una base de datos relacional.

Pero como Symfony2 es un Framework Orientado a Objetos, nos gustaría manipular los objetos cada vez que podamos. Por ejemplo, en lugar de escribir sentencias SQL para recuperar los registros de la base de datos, preferimos más usar los objetos.

Yo usaré Doctrine para tal menester, aunque también se podrían utilizar Propel o MongoDB

Para insertar los parámetros de la base de datos podemos bien rellenarlos en el fichero app/config/parameters.yml o usar el asistente en http://www.jobeet.dev/_configurator/step/0 (o ir a http://www.jobeet.dev y pulsar el botón de configurar)

Configurar Base de Datos en Symfony2

Y rellenamos los datos de conexión de nuestra base de datos así como el nombre que queramos dar a la misma. Y tras darle al próximo pas, configuramos la clave secreta

Clave Secreta Symfony2

Finalmente si tiene permisos para editar el fichero app/config/parameters.yml nos saldrá una pantalla diciendo que está todo configurado y sino nos dirá que tenemos que copiar y pegar esa configuración manualmente en nuestro fichero yml

Una vez tengamos parameters.yml con los datos adecuados, para crear la base de datos (dentro de la carpeta de nuestro proyecto por consola) escribiremos:

php app/console doctrine:database:create

Si vamos con el phpmyadmin mismamente podremos ver que la base de datos ya está creada pero sino hemos cambiado la configuracion del MySQL el cotejamiento será latin1_swedish_ci (Lo podemos cambiar en la pestaña Operaciones/Cotejamiento)

Para evitar esto en sucesivas tendremos que añadir al fichero de configuración de MySQL (por lo general my.cnf) las lineas:

Y recordar que tenemos que resetear el servicio

sudo /etc/init.d/mysql restart

En el proyecto original la configuración de cada entidad la realizan en yml, yo en este caso lo único que he trabajado ha sido por anotaciones por lo que lo haré así. Crearemos la carpeta src/MDUA/JobeetBundle/Entity y allí crearemos un archivo por entidad (Category, Job, Affiliate) Con sus datos correspondientes.

 

 

 

Otra forma de generar entidades es usando el generador automático de Symfony2

php app/console doctrine:generate:entity

Primero nos preguntará el nombre de la entidad, ej: MDUAJobeetBundle:Category y el formato en el que se generará. Posteriormente nos pedirá la información de los campos.

Los tipos que podemos usar son

  • string
  • integer
  • smallint
  • bigint
  • boolean
  • decimal
  • date
  • time
  • datetime
  • text
  • object
  • array
  • float

Para más información tenemos la  documentación de Doctrine,

Para generaremos los getters y los setters de todo el bundle deberemos poner

php app/console doctrine:generate:entities MDUAJobeetBundle

si quisiéramos hacerlo solo de una entidad sería

php app/console doctrine:generate:entities MDUAJobeetBundle:Category

Ahora deberemos añadir un par de cosas ya que hay cosas que tenía symfony 1.4 que no tiene Symfony2 por ejemplo la opción de timestampeable

Para eso añadimos el comentario HasLifecycleCallbacks a todas las entidades

y añadimos dos funciones asodicados a los eventos prePersist y preUpdate

Como podemos ver ponemos en el prePersist la inicialización de created y de updated pues cuando se crea la entidad solo salta este evento.

Para el created podríamos haber  usado en vez de esto una inicialización en el constructor

Otra opción sería usar las extensiones de Doctrine. Que aparte de la opción de Timestampable también tiene Sluggable, Translatable, Loggable, Tree y Sortable.

Una vez nuestras entidades listas solo nos queda actualizar la base de datos.

php app/console doctrine:schema:update –force

Para actualizan la base de datos yo recomendaría el bundle DoctrineMigrations que nos permitirá tener un registro de las modificaciones que vamos haciendo en la base de datos, lo que nos puede ser muy útil cuando ya tenemos la base de datos en producción y hemos hecho modificaciones en desarrollo.

Añadimos a una nueva linea en “require”

Y actualizamos con:

composer update

Y añadimos el bundle al AppKernel.php

Con este bundle instalado para actualizar la base de datos en vez de usar la instrucción anterior, usaremos:

php app/console doctrine:migrations:generate

Sólo si es la primera vez que usamos el bundle

php app/console doctrine:migrations:diff

Para generar el reporte de cambios

php app/console doctrine:migrations:migrate

Para actualizar la base de datos

Los Datos Iniciales

Los tablas se han creado en la base de datos, pero no hay datos en ellas. Para cualquier aplicación web, hay tres tipos de datos:

 Datos Iniciales: Los datos iniciales son necesarios para que la aplicación funcione. Por ejemplo, Jobeet necesita algunas categorías iniciales. Si no, nadie será capaz de envíar un puesto de trabajo. También necesitamos un administrador de usuarios para poder acceder al backend.

 Datos de Prueba: Los datos de prueba son necesarios para que la aplicación sea probada. Como desarrollador, escribes pruebas para asegurarte que Jobeet se comporta como se describe en los casos de uso, y la mejor manera es escribir pruebas automáticas. Por lo tanto, cada vez que ejecutes tus pruebas, necesitas una base de datos limpia con algunos datos nuevos de prueba en ella.

Los Datos del Usuario: Los datos del usuario son creados por los usuarios durante la vida normal de la aplicación.

Cada vez que Symfony crea las tablas en la base de datos, todos los datos se pierden. Para rellenar la base de datos con algunos los datos iniciales, podriamos crear un script PHP, o ejecutar sentencias SQL con algun programa mysql. Pero como la necesidad es bastante común, hay una mejor manera con Symfony: usar el DoctrineFixturesBundle.

Para instalarlo como siempre, añadimos su dependencia en composer.json

actualizamos con

composer json

y añadimos el bundle a AppKernel.php

Crearemos unas clases en MDUA/DataFixtures/ORM que serán las que insertaran los datos iniciales en nuestra base de datos

 

Las imágenes que se usarán serán:

Como utilizamos doctrine para guardar los datos en la base de datos los campos que no hemos usado cogerán su valor por defecto y los comportamientos como preUpload y prePersist se activarán.

Para cargar los datos iniciales usamos:

 php app/console doctrine:fixtures:load

Y si miramos en nuestra base de datos veremos como ya tenemos datos en nuestras tablas.

Si no queremos que nos borre la base de datos deberemos poner

php app/console doctrine:fixtures:load –append

Y si queremos insertar ciertos fixtures en vez de todos a la vez

php app/console doctrine:fixtures:load –fixtures=src/MDUA/Bundle1 –fixtures=…..

Míralo en acción en el Navegador

Para poder ver los datos de la tabla jobs vamos a crear rápidamente el admin (si se le puede llamar así) de Symfony2 de dicha clase para ello escribimos en consola

php app/console generate:doctrine:crud –entity=MDUAJobeetBundle:Job –route-prefix=job –with-write –format=yml –no-interaction

Y nos dará un aviso que deberemos insertar nosotros unas lineas en el fichero src/MDUA/JobeetBundle/Resources/config/routing.yml

Estro crea un archivo JobController.php dentro de la carpeta Controller con las funciones necarias para mostrar, listar, editar y borrar. También una carpeta Job con  archivos de las vistas dentro de Resources/views. Y un archivo job.yml en Resources/config/routing con las rutas del crud.

Si vamos al navegador a http://www.jobeet.dev/job/ ya podemos ver toda nuestros datos de la tabla jobs

Si vamos a editar cualquier registro nos saldrá un error:

A “__toString()” method was not found on the objects of type “MDUAJobeetBundleEntityCategory” passed to the choice field. To read a custom getter instead, set the option “property” to the desired property path.

Esto es debido a que en category no tenemos un método __toString() que es el que se usará para cuando queremos mostrar la entidad directamente (por ejemplo symfony2 automaticamente en los combox) y no un campo en especifico

En Category

En Job

En Affiliate

Ahora puedes editar y crear puestos de trabajo. Trata de dejar un campo obligatorio en blanco, o tratar de dar una fecha no válida. Así es, Symfony ha creado básicas reglas de validación analizando el esquema de base de datos.

Nos vemos mañana

Eso es todo por hoy. Te lo advertí en la introducción. Hoy, apenas hemos escrito el código PHP, pero tenemos un módulo web para el modelo job, listo para ser personalizado. ¡Recuerda, menos código PHP también significa menos errores!

Si todavía te queda algo de energía, no dudes en leer el código generado para el módulo y el modelo y tratar de entender cómo funciona. Si no, no te preocupes y duerme bien, mañana, vamos a hablar de uno de los paradigmas más utilizados en los frameworks web, el Patrón de Diseño MVC.

3 Responses to “Jobeet, Día 3: El Modelo De Datos”

  1. Luis Angel Perez Calaña

    Hola colega, realmente esta muy buena esta guía que estas haciendo, pero por favor continua con haciendola, así las personas como yo que estamos aprendiendo no nos perdemos tanto y nos guiamos por una idea real como la que estas llevando a cabo……saludos y por fa…continua!!

    Responder
  2. Aprendiz

    Gracias por pasarte por aquí, intentaré hacerla pero tengo muy poco tiempo, tengo que terminar un proyectito que estoy haciendo que me está quitando la vida xD, luego me han salido dar clases a niños entre semana (con lo fácil que son las matemáticas ains… ) y con el poco tiempo que me queda debería hacer caso a la novia… jeje

    De todas formas yo intentaré seguir haciéndola pero te recomiendo el libro de Javier Eguiluz Desarrollo web ágil con Symfony2(Está mucho mejor explicado las cosas de como yo lo hago), que fue lo primero que me leí dencente de Symfony2 y la verdad que se lo ha currado mucho y ha sacado una nueva versión para Symfony2.1. Desde su web lo puedes comprar por solo 10€

    Esto es más un reto personal para mí a ver si soy capaz de hacerlo y de terminarlo jeje

    Responder

Deja un comentario

  • (will not be published)


2 + 4 =