Dans une application, il est impératif de se soucier de la portabilité de son application et de son aptitude à s’intégrer à plusieurs système de base de données. Pour cela, il faut gérer les transactions avec cette dernière avec un outil indépendant d’une base de données.

On appelle cela une couche d’abstraction qui sert intermédiaire entre la base de données et l’application. Le but est de modéliser le schéma d’une base de données sous forme de classes et d’objet pour ne pas travailler avec le langage SQL et les drivers de base de données car il est évident qu’une application écrite de A à Z avec des mysql_connect() et mysql_query() ne sera pas très robuste et migrera difficilement vers un autre SGBD comme Postgre ou Oracle…

Zend_Framework fournit un outil nommé Zend_Db_Table pour gérer à l’aide d’un système de DAO (Database Access Object) les transactions avec les bases de données.

Nous allons voir dans un premier temps comment configurer Zend_Framework pour mettre en place ce système :

Configuration du fichier Application.ini :

;database configuration
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname = "announcements"
resources.db.params.date_format = "YYYY-MM-ddTHH:mm:ss"
resources.db.isDefaultTableAdapter = true

Il faut spécifier dans le « Application.ini » les paramètres pour accéder à votre base de données, il faut y spécifier l’adresse de la base, le type (pdo_mysql, postgre, sqllite, oci8, mssql, …), l’utilisateur avec le mot de passe, le nom de la base de données et le format de date et heure.

Ecrire les classes d’accès aux données (utilisation de Zend_Db_Table) :

Il nous faut maintenant écrire les classes permettant de modéliser  les tables de la base de données pour cela on va utiliser Zend_Db_Table pour générer une classe permettant d’accéder à la table « posts  » de notre application :

On créer tout d’abord un dossier « models » dans notre répertoire /application avec un dossier DbTable dedans.

Nous allons générer un fichier Post.php :

Tout d’abord,  on crée une classe dérivée de Zend_Db_Table que l’on nommera avec la syntaxe suivante : Model_DbTablr_NomDeLaTable en spécifiant le nom extact dans l’attribut protégé « name » :

Ensuite il ne reste plus qu’à écrire les méthodes qui permet les transactions avec les bases de données, je recommende fortement d’utiliser une méthode pour chaque transaction plutôt que de les écrire dans le contrôleur, on est dans un design-pattern MVC !

Voici le prototypage de notre classe et l’implémentation de notre classe :

class Model_DbTable_Post extends Model_Db_Table
{
      $_name = 'post';
              function getPost() {
                fetchRow('id = '.(int)$id);
		if (!$row)
		{
			// On lance une exception en cas d'erreur
			throw new Exception ("Erreur, l'enregistrement $id n'existe pas !");
		}
		// On retourne le résultat sous forme de tableau
		return $row->toArray();
	}

	/**
	 * Ajoute un article en base de données
	 * @param $values
	 * @return unknown_type
	 */
	public function addPost ($values)
	{
		// On enregistre les valeurs sous forme de tableau [champs] => valeur
		$result = $this->insert($values);
		if (!$result)
		{
			throw new Exception ("Erreur impossible d'enregister");
		}
	}

	/**
	 * Met à jour un article en base de donneés
	 * @param $values
	 * @return unknown_type
	 */
	public function updatePost ($id,$newValues)
	{
		$result = $this->update($newValues, 'id = '.(int)$id);
		if (!$result)
		{
			throw new Exception ("Erreur impossible de mettre à jour");
		}
	}

	/**
	 * Supprime l'article $id
	 * @param $id
	 * @return unknown_type
	 */
	public function removePost ($id)
	{
		$result = $this->delete('id = '.$id);
		if (!$result)
		{
			throw new Exception ("Erreur impossible de supprimer");
		}
	}

	/**
	 * Requête avec jointure pour récupérer les 5 premiers
	 * articles avec les données de la table auteur en jointure
	 * et qui ont leur status publié
	 * @return unknown_type
	 */
	public function findPostsWithAuthorsInformations ()
	{
		$db = $this->getAdapter();

		$select = $db->select()
					 ->from('post')
					 ->joinInner('author', 'post.author_id = author.id')
					 ->where('status = "published"')
					 ->limit(5);
		$query = $select->query();
                $result = $query->fetchAll()

		return $result;
	}
}
?>

Pour appeler cette classe dans le contrôleur rien de plus simple, on instancie un objet « $model » et pis on appelle les méthodes que l’on a implémentée :

addPost(array('title' => 'test', 'content' => 'ceci est mon premier post', 'status' => 'publised'));

			// Requête
			$this->view->posts = $model->findPostsWithAuthorsInformations();

			// Suppression
			$model->removePost(2);

		}
	}
?>

La prochaine fois nous verrons le fonctionnement des formulaires avec Zend_Form