Tout programmeur java connait bien hibernate ou ses equivalents et ne saurait plus maintennant s’en passer. Finalement, la création des requettes SQL est tellement génératrice de bugs dans le cycle de vie d’un projet, que l’utilisation d’une solution de mapping objet relationnelle (ORM) comme solution de persistence de vos données, doit devenir naturelle. C’est un énorme gain en programmation, en phase de recette, et assure que les principalles attaques possible sont déja corrigées dans le framework. Un petit zoom d’initiation à propel php.

Objéctif de ce tutorial :
N’avoir plus de code à ecrire pour la base de donnée autre que par exemple :

monChat = new Cat();
monChat->setName( « grosMatout » );
monChat->save();

Voilà… le tout sans evidemment passé une journée à configurer le bouzin :-)

1) Installation de propel sous windows :

– installez php5 et pear. Pour rappel, il suffit de prendre un executable de php5 sur http://www.php.net et de lancer sous dos la commande go-pear.bat .

Ensuite dans une commande MSDOS lancez :
Installation de phing (Phing est une sorte de ANT en php).
1) -> $> pear channel-discover pear.phing.info
2) -> $> pear config-set preferred_state beta
3) -> $> pear install phing/phing

Installation de Créole (Créole est une couche d’abstraction entre base de donnée et application en php5).
1) -> $> pear install http://creole.phpdb.org/pear/creole-current.tgz
2) -> $> pear install http://creole.phpdb.org/pear/jargon-current.tgz

Installation de Propel (Nous avons besoin du générateur en ligne de commande afin de construire le schéma de base).
1) -> $> pear config-set preferred_state beta
2) -> $> pear channel-discover pear.phpdb.org
3) -> $> pear install phpdb/propel_generator
4) -> $> pear install phpdb/propel_runtime (option non obligatoire pour la génération du schéma).

Voilà, si vous tapez la commande phing, vous devriez avoir le message :
« F:devpropelgeneratorprojects>phing
Buildfile: build.xml does not exist! »

Pour travailler avec propel, vous devez respecter son arboréscence de répertoires, ce qui est bien plus simple si vous recuperez le paquage depuis le site de propel : « http://propel.phpdb.org/trac/wiki/Users/Download »

2) Création du model objet :

Imaginons que nous avons deux objets : Un chien, ayant un nom, et des jouets ayant aussi des noms et un attribut pouet, qui dira si oui ou non, ce jouet est bruyant. Un chien peut avoir N jouet, mais chaque jouet n’appartient qu’a un chien, d’ou une relation chien/jouet 1/N. le fichier schema.xml sera le suivant :

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE database SYSTEM "../dtd/database.dtd">

<database name="sampleDB" defaultIdMethod="native">

	<!--
		CHIEN Object description
	-->
	<table name="chien" defaultIdMethod="native">

		<column
			name="id"
			required="true"
			primaryKey="true"
			autoIncrement="true"
			type="INTEGER"/>

		<column
		        name="nom"
			required="true"
			type="VARCHAR"
                        size="255"/>

	</table>

	<!--
		JOUET Object description
	-->
  	<table name="jouet" defaultIdMethod="native">

		<column
			name="id"
			required="true"
			primaryKey="true"
			autoIncrement="true"
			type="INTEGER"/>

		<column
			name="nom"
			type="INTEGER"
			defautl="0"/>

		<column
			name="chien_id_FK"
			required="false"
			type="INTEGER"
			default="0"/>

		<column
			name="pouet"
			required="yes"
			type="INTEGER"/>

		<foreign-key foreignTable="chien" onDelete="SETNULL">

		</foreign-key>

  	</table>

</database>

Que dire de plus ???? simple….

2) Génération du schéma SQL et des objets PHP5 :

Mon installation de propel est sur : « F:devpropel »
Je vais donc en MS dos aller sur : « F:devpropelgeneratorprojects> »

Puis il suffit de taper la commande : « F:devpropelgeneratorprojects>propel-gen shop » ou « shop » est le nom du projet.

2) Utilisation dans un exemple :

<?

// Framework includes
include_once("propel/Propel.php");
// Ce fichier est généré par léxecution de la commande de génération du SQL.
Propel::init("shop-conf.php");

include_once 'shop/Chien.php';
include_once 'shop/Jouet.php';

// Creation et sauvegarde:

$chien = new Chien();
$chien -> setNom ("toto");

$jouet = new Jouet();
$jouet -> setNom ("canard");
$jouet -> setPouet (1);

$jouet -> setChien ( $chien );

$chien -> save();
$jouet -> save();

?>

Remarque : le mapping ci-dessus n’est qu’un exemple, il serait plus judicieux de le revoir pour eviter la double commande :
$chien -> save();
$jouet -> save();

Voilà…