﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alexandre JULIEN &#187; Zend f</title>
	<atom:link href="http://www.alexandre-julien.com/tag/zend-f/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.alexandre-julien.com</link>
	<description>Industrialisation des développements, PHP, .NET, jQuery, HTML5, Web, …</description>
	<lastBuildDate>Sun, 22 Jan 2012 20:26:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Zend Framework tutoriel #3 : Couche modèle, interaction avec une base de données avec Zend_Db</title>
		<link>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-tutoriel-3-couche-modele-interaction-avec-une-base-de-donnees-avec-zend_db/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=zend-framework-tutoriel-3-couche-modele-interaction-avec-une-base-de-donnees-avec-zend_db</link>
		<comments>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-tutoriel-3-couche-modele-interaction-avec-une-base-de-donnees-avec-zend_db/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 17:21:35 +0000</pubDate>
		<dc:creator>Alexandre JULIEN</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Model]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[tutoriel]]></category>
		<category><![CDATA[Zend f]]></category>
		<category><![CDATA[Zend_Db]]></category>

		<guid isPermaLink="false">http://www.alexandre-julien.com/?p=633</guid>
		<description><![CDATA[Dans une application, il est impératif de se soucier de la portabilité de son application et de son aptitude à s&#8217;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&#8217;une base de données.
On appelle cela une couche  [...]]]></description>
			<content:encoded><![CDATA[<p>Dans une application, il est impératif de se soucier de la portabilité de son application et de son aptitude à s&#8217;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&#8217;une base de données.</p>
<p>On appelle cela une couche d&#8217;abstraction qui sert intermédiaire entre la base de données et l&#8217;application. Le but est de modéliser le schéma d&#8217;une base de données sous forme de classes et d&#8217;objet pour ne pas travailler avec le langage SQL et les drivers de base de données car il est évident qu&#8217;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&#8230;</p>
<p><span id="more-633"></span>Zend_Framework fournit un outil nommé Zend_Db_Table pour gérer à l&#8217;aide d&#8217;un système de DAO (Database Access Object) les transactions avec les bases de données.</p>
<p>Nous allons voir dans un premier temps comment configurer Zend_Framework pour mettre en place ce système :</p>
<p><span style="text-decoration: underline;">Configuration du fichier Application.ini :</span></p>
<pre lang="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</pre>
<p>Il faut spécifier dans le &laquo;&nbsp;Application.ini&nbsp;&raquo; les paramètres pour accéder à votre base de données, il faut y spécifier l&#8217;adresse de la base, le type (pdo_mysql, postgre, sqllite, oci8, mssql, &#8230;), l&#8217;utilisateur avec le mot de passe, le nom de la base de données et le format de date et heure.</p>
<p>Ecrire les classes d&#8217;accès aux données (utilisation de Zend_Db_Table) :</p>
<p>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&#8217;accéder à la table &laquo;&nbsp;posts &nbsp;&raquo; de notre application :</p>
<p>On créer tout d&#8217;abord un dossier &laquo;&nbsp;models&nbsp;&raquo; dans notre répertoire /application avec un dossier DbTable dedans.</p>
<p>Nous allons générer un fichier <strong>Post.php :</strong></p>
<p>Tout d&#8217;abord,  on crée une classe dérivée de Zend_Db_Table que l&#8217;on nommera avec la syntaxe suivante : Model_DbTablr_NomDeLaTable en spécifiant le nom extact dans l&#8217;attribut protégé &laquo;&nbsp;name&nbsp;&raquo; :</p>
<p>Ensuite il ne reste plus qu&#8217;à écrire les méthodes qui permet les transactions avec les bases de données, je recommende fortement d&#8217;utiliser une méthode pour chaque transaction plutôt que de les écrire dans le contrôleur, on est dans un design-pattern MVC !</p>
<p>Voici le prototypage de notre classe et l&#8217;implémentation de notre classe :</p>
<pre lang="php">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-&gt;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] =&gt; valeur
		$result = $this-&gt;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-&gt;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-&gt;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-&gt;getAdapter();

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

		return $result;
	}
}
?&gt;</pre>
<p>Pour appeler cette classe dans le contrôleur rien de plus simple, on instancie un objet &laquo;&nbsp;$model&nbsp;&raquo; et pis on appelle les méthodes que l&#8217;on a implémentée :</p>
<pre lang="php">< ?php
	class PostController extends Zend_Controller_Action
	{
		public function init ()
		{
			// On fait rien
		}

		public function testModelAction ()
		{
			$model = new Model_DbTable_Post();

			// Ajout
			$model->addPost(array('title' => 'test', 'content' => 'ceci est mon premier post', 'status' => 'publised'));

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

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

		}
	}
?></pre>
<p>La prochaine fois nous verrons le fonctionnement des formulaires avec Zend_Form</p>
]]></content:encoded>
			<wfw:commentRss>http://www.alexandre-julien.com/php/zend-framework-php/zend-framework-tutoriel-3-couche-modele-interaction-avec-une-base-de-donnees-avec-zend_db/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching 1/5 queries in 0.057 seconds using disk: basic
Object Caching 650/650 objects using disk: basic

Served from: www.alexandre-julien.com @ 2012-02-18 13:43:39 -->
