Début 2009, l'équipe de Gepi a décidé d'intégrer une librairie php d'ORM : Propel 1.3

Installer Propel sur son environnement de développement

--> Voir la documentation officielle.

Principes généraux

  • Propel est une librairie ORM qui tente de porter Hibernate (projet JAVA) en php. Elle est basée sur la même logique de construction que TORQUE qui est lui aussi un projet d'ORM pour java.
  • Son principe est simple : on fournit un fichier xml qui explique la structure de la base de données et Propel génère toutes les classes utiles pour interférer avec la base ainsi que le SQL de création de la base.
  • Le motif de base de Propel est le Data Mapper et a donc besoin de plusieurs classes pour chaque table.
# Exemple
la table travailleurs (id, nom, metier) va entrainer la création de 4 classes :
- Travailleur qui implémente [[BaseTravailleur]]
- [[TravailleurPeer]] qui implémente [[BaseTravailleurPeer]]

[[BaseTravailleurPeer]] ne contient que des méthodes statiques destinées en interférer avec la base.
[[BaseTravailleur]] contient toutes les propriétés de l'objet (les champs de la table et quelques autres) et les méthodes de base (gettings, settings, ...)

  • Il faut donc générer ces classes à l'aide d'un fichier de configuration : schema.xml.
# Config
Le fichier xml contient la structure de la base

<database name="gepi" defaultMethod="native">
  <table name="travailleurs" description="Les travailleurs de Gepi sont stockés dans cette table">
    <column name="id" type="INTEGER" required="true" primaryKey="true" description="id unique de la table travailleurs" />
    <column name="nom" type="VARCHAR" size="255" required="true" description="Nom du travailleur de Gepi" />
      <validator column="nom">
        <rule name="unique" message="Ce nom est déjà pris, vous devez en changer !" />
      </validator>
    <column name="metier" type="VARCHAR" size="255" required="true" description="Métier du travailleur de Gepi" />
  </table>
</database>


--> Rien de bien compliqué même si on voit que le fichier peut être très complet. La balise <validator> peut permettre d'ajouter une méthode de vérification du contenu du champ avant sa sauvegarde (à ce sujet, voir la documentation officielle).

A cette structure, on peut ajouter les relations avec les autres tables. Exemple avec la table photos(id, travailleur_id, chemin_photo).

# Config
Au fichier précédent, on ajoute (avant </database>)

  <table name="photos" description="Stockage du chemin relatif des photographies des travailleurs de Gepi">
    <column name="id" type="INTEGER" required="true" primaryKey="true" description="id unique de la table photo" />
    <column name="travailleur_id" type="INTEGER" required="true" description="id du travailleur en question" />
      <foreign-key foreignTable="travailleurs">
        <reference local="travailleur_id" foreign="id" />
      </foreign-key>
    <column name="chemin_photo" type="VARCHAR" size="255" required="true" description="Chemin relatif du stockage de la photographie" />
  </table>

--> Il est donc important de bien travailler sur ce fichier xml avant de passer à la suite ==> Utiliser les classes générées par Propel.