Manos a la obra con Symfony: el modelo

Estándar

A medida que voy avanzando con Symfony y teniendo cada vez una visión más en conjunto del framework me voy dando cuenta de que hay muchas cosas que he aprendiendoo me han enseñado sobre la marcha y que me gustaría compartir con vosotros para que empecéis desde ya a poneros manos a la obra con ese proyecto que tenéis en mente desde hace algún tiempo….

No pretendo reemplazar el excelente tutorial de Jobeet ni toda la documentación que podéis encontrar en el propio sitio web de Symfony (que por cierto, es de las más completas que he visto), si no dar a través de varios posts lo que para mí rige lo básico que hay que conocer sobre Symfony para encarar un proyecto web. Ya no hay excusa para decir que es muy difícil usar frameworks…. 😉

Éste primer post trata, como no podía ser de otra forma, del modelo de datos.

Pre-requisitos

Antes de empezar  cualquier proyecto deberíamos haberlo creado. Symfony considera un proyecto como cualquier conjunto de aplicaciones que comparten el mismo modelo. Ésto puede sonar muy rimbombante pero lo que quiere decir es lo siguiente: quiero montar una web que vea la gente, luego quiero tener un backoffice en el que gestionar mis datos y quiero hacer una adaptación de mi web para que tenga versión móvil. Pues bien, el ejemplo anterior se traduce en symfony en un proyecto “proyectoX” con 3 aplicaciones (frontend, backend,movil).

Entonces, consideraremos pre-requisito para empezar a diseñar el modelo que préviamente hayamos creado el proyecto. Ésto se puede hacer de la siguiente manera:

symfony generate:project proyectoX
symfony generate:app frontend

Modelo de datos

Vale, ya tengo en mente un proyecto, conozco su lógica de negocio y quiero ponerme manos a la obra. Pues lo primero sobre lo que deberías trabajar es sobre la M del MVC, es decir, el modelo de datos.

En primer lugar deberíamos definir el modelo. Ésto puede hacerse a través del fichero situado en  config/doctrine/schema.yml Ése fichero usa el formato YAML. No hace falta te leas todo, básicamente deberías saber “transformar” tu modelo entidad relación a YAML ¿no crees?

Importante: para “tabular” usa espacios, si no te fallará al intentar generar el modelo.

Ejemplo entidad simple 1

JobeetCategory:
  columns:
    name: { type: string(255), notnull: true, unique: true }

Crea una tabla JobeetCategory con PK “id” automáticamente

Ejemplo entidad simple 2

JobeetCategory:
  columns:
    jobcat: { type: integer, primary: true }
    name: { type: string(255), notnull: true, unique: true }

Crea una tabla JobeetCategory con PK “jobcat”.

Ejemplo relación 1:1

Profile:
  columns:
    sf_guard_user_id: integer(4)
    full_name: string(255)
    email_address: string(255)
  relations:
    User:
      class: sfGuardUser
      local: sf_guard_user_id
      foreign: id
      foreignType: one

Crea una relación entre “Profile” y “User”. El campo de relación es el “id”.

Ejemplo relación 1:N

User:
  # ...
  relations:
    Phonenumbers:
      type: many
      class: Phonenumber
      local: id
      foreign: user_id

Phonenumber:
  columns:
    user_id: integer
    phonenumber: string(50)
  relations:
    User:
      local: user_id
      foreign: id

Crea una relación entre “User” y “Phonenumber”. El campo de relación es el “id”.

Ejemplo relación N:N

JobeetCategory:
  actAs: { Timestampable: ~ }
  columns:
    name: { type: string(255), notnull: true, unique: true }

JobeetAffiliate:
  actAs: { Timestampable: ~ }
  columns:
    url: { type: string(255), notnull: true }
    email: { type: string(255), notnull: true, unique: true }
    token: { type: string(255), notnull: true }
    is_active: { type: boolean, notnull: true, default: 0 }
  relations:
    JobeetCategories:
      class: JobeetCategory
      refClass: JobeetCategoryAffiliate
      local: affiliate_id
      foreign: category_id
      foreignAlias: JobeetAffiliates

JobeetCategoryAffiliate:
  columns:
    category_id: { type: integer, primary: true }
    affiliate_id: { type: integer, primary: true }
  relations:
    JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id }
    JobeetAffiliate: { onDelete: CASCADE, local: affiliate_id, foreign: id }

Crea una relación entre “JobeetCategory” y “JobeetAffiliate” llamada “JobeetCategoryAffiliate”.

Vale, ¿y ahora qué?

Pues ahora ya eres el gurú de la creación de modelos en YAML y sólo te queda generarlo. Vamos a suponer que tienes mysql instalado así que bastará con ejecutar lo siguiente:

php symfony configure:database "mysql:host=localhost;dbname=jobeet" root mYsEcret
php symfony doctrine:build --all

La primera instrucción asocia tu proyecto a la base de datos donde se va a ejecutar y la segunda genera el código.

Vale, pero ¿qué genera exactamente?

Pues si exploras verás que en la carpeta lib/model/doctrine te ha creado(entre otras cosas) 2 ficheros .php por cada tabla. Y además dispones de una carpeta base en la que tienes los mismos ficheros con la palabra Base delante.

¿Y porqué hay una clase base que tiene todo el contenido y la otra que hereda no tiene nada?
Pues porque cada vez que ejecutes “doctrine:build –all” vas a sobreescribir el contenido de la carpeta “base” y si deseas realizar alguna personalización sobre la tabla es mucho mejor hacerla sobre la que hereda de base para no perder los cambios.

¿Y porqué hay 2 ficheros por cada tabla?
El fichero llamado Entidad.class.php representa un objeto y por tanto un registro de la tabla.
El fichero llamado EntidadTable.class.php representa una clase y por tanto una tabla de la base de datos.

Proximamente…

Formularios simples.

Anuncios

13 comentarios en “Manos a la obra con Symfony: el modelo

  1. JAIME

    hola ivan

    Tengo una pregunta para ti,, poco conozco de simfony, pero dime si es posible montar todo un programa contable con dicha aplicacion o si tenes algun ejemplo.
    y como seria el manejo de la base de datos.

    muchas gracias por tu colaboracion, ya que es de suma importancia para mi y mi prosperidad laboral.

    jaime

  2. ivandebenito

    Hola Jaime.

    Sí, claro que es posible montar lo que comentas. A fin de cuentas Symfony únicamente es un framework (marco de trabajo) que te va a facilitar la tarea de programar la aplicación que deseas.

    No se que nivel de conocimientos sobre programación tienes y tampoco conozco tu dominio de PHP. Si dominas PHP, Symfony te facilitará mucho la tarea para trabajar con ello.

    Si tienes cualquier otra duda no dudes en contactarme.

    Un saludo,
    Iván

  3. JAIME

    Ivan muchas gracias por responderme. habia iniciado la aplicacion en extjs pero me encontre con muy pocas ayudas. dime si conoces algo de extjs y si es compactible con simfony. en extjs ya tenia los formularios creados pero no habia realizado conexion con la base de datos.
    Veo que este framework tiene muchas ayudas.
    perdoname la molestia pero dime como empiezo con simfony.
    muchas gracias en todo lo que puedas colaborarme.
    jaime hernan

  4. ivandebenito

    Jaime, si no recuerdo mal ExtJs es una librería para desarrollar la parte visual de la aplicación. La parte de guardar datos en la base de datos, etc se acaba haciendo con llamadas a algún PHP de una forma u otra.
    En cuanto a si son compatibles… imagino que si, cuando hay un plugin http://www.symfony-project.org/plugins/sfExtjsThemePlugin 😉
    En cuanto a como empezar hay muchos modos… pero depende mucho del nivel que tengas tú. ¿qué tal se te da la programación en PHP?

    • JAIME

      ivan gracias por tu ayuda
      mi nivel en php es medio, conozco algunas cosas pero no estoy muy avanzado. con symfony tambien se puede obtener una parte visual agradable?, en extjs se almacenaban los datos en una base de datos de mysql y se cargaban mediante archivos json que eran realizados en codigo php.
      en realidad amigo necesito desarrollar una aplicacion contable deseo empezar con symfony dime la factibilidad, soy una persona ya de 46 anos y esta es una oportunidad que me estan dando en una empresa ya que en mi pais si uno tiene mas de 35 anos es dificil encontrar empleo.. gracias por toda tu ayuda

      • Carlos Torres

        Buen Día Jaime, yo también ando en lo mismo, Desarrollar una Aplicación Web, y lo quiero hacer son Symfony. Ya han pasado casi 5 meses desde que comentaste por aquí, y me gustaría saber ¿Como te fué? y ¿Si tuviste éxito con el Framework?

  5. ivandebenito

    Si Jaime, todo lo que comentas se puede realizar. Pero es como todo, cuestión de ponerse y pelearse… no esperes conseguir resultados inmediatos. Todo dependerá del tiempo que le dediques, cuanto más le dediques mucho mejor.

    Échale un vistazo a estos post que hice, a la guía oficial de symfony, al tutorial Jobeet… la verdad que puedes encontrar muchos sitios con excelente documentación.

    ¡Ánimo Jaime, lo lograrás! 🙂

  6. Muy buenos tus aportes para entender un poco mas sobre este framework. Soy principiante con symfony…. y quisiera saber si alojar un sitio web desarrollado con symfony en un hosting contratado, es sencillo? y su configuracion tambien?? Tengo Windows xp. ¿Cual es tu experiencia con respecto a esto?
    Saludos desde Argentina.

  7. Iván de Benito

    Hola Alberto, me alegra que me digas que te es útil porque esa es la idea 🙂

    Respondiendo a tus preguntas… no necesitas nada de especial para alojar un sitio web desarrollado en Symfony salvo que tenga soporte para PHP y Mysql (si usas Mysql).
    Luego a la hora de subirlo deberás adaptar tu configuración a la que tiene el propio servidor más que nada por tema de rutas desde donde se accede al ProjectConfiguration.class.php y alguna cosilla más que te salga… pero bueno, no es complejo, es como todo, pelearse un poco y al final salen las cosas jeje.

    Saludos desde Mallorca.

  8. Juan Martin Diaz

    Estimado Ivan, estoy comenzando en esto del desarrollo con symfony, tengo un proyecto para desarrollar y me gustaría que fuera mi primera experiencia real con el framework.
    Antes de comenzar me puse a investigar un poco sobre el tema del deployment para la hora de la implementación.
    Estuve leyendo un poco la documentación y encontre que para actualizaciones parciales el fw monta rsync sobre ssh, ergo se requiere que el proveedor de hosting nos facilite acceso vía ssh, lo cual he visto es “poco común” en servidores compartidos.
    En síntesis, quería preguntarte en tu experiencia, que cosas debería tener en cuenta en relación a la elección de un proveedor de hosting.
    Desde ya muchas gracias!

  9. JMartinB

    Hola Ivan, muy bueno el tutorial.

    Tengo una duda sobre si es posible utilizar symfony 1.4 sobre una base de datos SqlServer 2005 que ya tiene datos cargados y cuenta con al menos 50 tablas.

    Si es posible, que debería configurar para poder realizar consultas mediante doctrine???

    Muchas Gracias

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s