Sep 21

Symfony+Propel: usar múltiples schemas en un sol projecte

Reading time: 2 – 3 minutes

La idea que es persegueix al usar múltiples esquemes en un sol projecte és la de poder usar múltiples bases de dades en un sol projecte. La idea sembla molt senzilla, però a través de la documentació oficial del projecte Symfony la veritat és que no he sabut trobar la solució. En l’explicació per portar a terme aquesta funcionalitat hem referiré tota l’estona als fitxers .yml i no als .xml equivalents, però suposo que la idea és totalment exportable.

Es tracta de deixar d’usar el fitxer schemal.yml i passar a usar diferents fitxers anomentats nomarbitrari_schema.yml, si encomptes d’un nom voleu usar un número tampoc hi ha problemes per fer-ho, per exemple, 1_schema.yml i successius.

Pel que fa al contingut d’aquests fitxers és el de sempre, tot i que jo ús recomanaria usar petites ajudes com aquesta:

nombasededades:
  _attributes:
    package: lib.model.nombasededades

Aquest nombasededades l’usarem després per especificar les dades de connexió al fitxer databases.yml, però potser el més interessant és fixar-se en el paràmetre package que ens permet que tot el model de dades quedi guardat dins de lib/model/nombasedades. O sigui, que tot queda molt més ben organitzat i fàcil d’accedir.

Cal que vigileu si dues bases de dades tenen dues taules que s’anomenen igual, ja que si això passa llavors hi haurà un conflicte en els models de dades que es generen, perquè aquestes tindran el mateix nom. Això és fàcilment solucionable simplement a l’schema heu de dir-li que el nom de la classe que representa les dades d’aquella taula de la base de dades és un nom diferent al de la taula, o sigui, el nom escollit per defecte.

Pel que fa al fitxer databases.yml el seu contingut és el de sempre, simplement cal que penseu que cal descriure la connexió de cada una de les bases de dades que heu anat declarant als diferents fitxers d’schema.yml, un exemple:

all:
  nombasededades1:
    class:                sfPropelDatabase
    param:
      ...
  nombasededades2:
    class:                sfPropelDatabase
    param:
      ...

Un cop ben configurat tot això ja podem fer un típic symfony propel-build-model i llestos.

Apr 08

Aprenent PROPEL amb 30min

Reading time: 2 – 4 minutes

Propel és un framework de PHP que permet accedir a les bases de dades usant objectes, ens ofereix una API molt senzilla que és capaç de filtrar les queries contra la base de dades perquè sigui completament transparents a la nostre aplicació. Perquè ens entenguem estem parlant de coses que de ben segur coneixeu com ara el DAO o el ORM.

grafic-propel.gif

Per fer-nos una idea per definir l’estructura d’una base de dades només cal que escribim un fitxer XML amb els camps de les taules, tipus, relacions, etc i el Propel farà la resta. Llavors el Propel es posa a generar totes les classes automàticament, i els fitxers .sql amb els esquemes de definició de les bases de dades. Amb les classes que ens ha generat el Propel podem accedir a totes les funcions bàsiques d’accés a la base de dades és el que se’n diu CRUD (def.wikipedia).

Si voleu aprofundir en tema us recomano que seguiu els passos que vaig seguir jo i amb 30min us sentireu com de la família:

  • QuickStart – Com crear les BBDD, taules i altre elements al voltant de les dades per tal de poder treballar de forma trivial amb elles
  • CRUD explica com usar les funcions bàsiques de CRUD amb Propel.
  • Esquemes dels fitxers XML. Quan definim l’esquema de la BBDD ens interessa coneixer a fons la sintaxis suportada per tal d’aprofitar al màxim les funcions del propel
  • Relacions entre taules. Donant una mica d’emoció a les dades, usant relacions entre taules senzilles.
  • Captura d’errors. Si ens interessa unificar les sortides d’error de Propel és molt senzill fer-ho.
  • Les relacions many-to-many (molts-a-molts) no estan suportades directament pel propel i s’han de fer a través d’una taula intermitja. Malgrat ens permet sortir del pas és un dels punts a evolucionar dins de propel. Si ens interessa millorar aquesta part podem incloure les nostres classes que implementin això pel nostre codi sense problemes dins de l’estructura estàndard del propel. De moment, si ho volem fer tal i com ens proposa el manual.