I. Public concerné




Ce tutoriel s'adresse aux débutants souhaitant s'initier à Zend Framework, mais connaissant déjà la notion MVC dans la théorie ou la pratique sur une autre technologie. Pour ce qui est de Zend Framework vous pouvez lire la Présentation ZF de julien-pauli, ainsi que le tutoriel du même auteur concernant le pattern MVC.

II. Arborescence



On commence tout d'abord par créer l'architecture de notre projet soit la suivante :

Image non disponible

III. Fichier d'amorçage

Dans le répertoire library on télécharge et on copie la librairie Zend Framework depuis l'adresse suivante : http://www.zend.com/en/community/downloads.
Puis on crée le fichier d'amorçage index.php, dans le répertoire racine "www" pour amorcer Zend_Controller_Front.
Le fichier d'amorçage est la page vers laquelle toutes les demandes sont dirigées "www/index.php" celui-ci va instancier et distribuer le contrôleur frontal, qui conduira les demandes vers les contrôleurs d'action.
Les commentaires des différentes lignes expliquent la démarche à suivre.


index.php
Sélectionnez

<?php

//on définit le chemin de notre application
define ( 'APPLICATION_PATH', realpath ( dirname ( __FILE__ ) . '/../' ) );

//on définit le chemin de notre librairie
$library = APPLICATION_PATH. '/library';
set_include_path ($library . PATH_SEPARATOR . get_include_path ());

//La classe Zend_Loader_Autoloader inclut des méthodes afin de nous aider à charger des fichiers
//dynamiquement.

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('App_');


//On charge les classes à utiliser ;
Zend_Loader::loadClass ( 'Zend_Controller_Front' );

try {
    
    //getInstance() est utilisé pour récupérer une instance du contrôleur frontal. 
	$front = Zend_Controller_Front::getInstance();
	
	//le contrôleur frontal renvoie les exceptions qu'il a rencontrées 
    //à l'objet de réponse, nous offrant une possibilité élégante de les gérer.
	$front->throwExceptions(true);
	
	//setControllerDirectory() est utilisé pour 
    //chercher les fichiers de
	//classes de contrôleurs d'action.
	$front->setControllerDirectory(APPLICATION_PATH . '/application/controllers');
	
	//Dispatch lance notre application, fait le gros travail du contrôleur frontal. 
	//Il peut facultativement prendre un objet de requête et/ou un objet de réponse,
	//permettant ainsi au développeur de fournir des objets personnalisés.
	$front->dispatch();
	
	//Traite les exceptions du contrôleur (généralement 404)
} catch (Zend_Controller_Exception $e) {
	include 'errors/404.phtml';
	//Traite les autres exceptions du contrôleur
} catch (Exception $e) {
	include 'errors/500.phtml';
}
?>




Afin de gérer correctement l'affichage des erreurs on crée les fichiers 404.phtml et 505.phtml dans le répertoire "errors" et on affiche les messages d'erreurs appropriés.

Image non disponible



Le contrôleur frontal : Zend_Controller_Front implémente un motif de contrôleur frontal utilisé dans les applications Modèle-Vue-Contrôleur (MVC). Son but est d'initialiser l'environnement de requête, d'acheminer la requête entrante et de distribuer ensuite n'importe quelles actions découvertes, il agrège n'importe quelles réponses et les retourne quand le processus est complet.

IV. Architecture MVC

IV-A. Le Contrôleur

On commence par créer un fichier PHP nommé "IndexController.php".
Remarquons bien que le nom est divisé par 2 IndexController :

  • Index (on le nomme ainsi puisque c'est la page principale de notre application qui est nommée index).
  • Controller (on le nomme ainsi puisque c'est un contrôleur).
IndexController.php
Sélectionnez

<?php
class IndexController extends Zend_Controller_Action
{
	public function indexAction()
	{

	}
}
?>

À ce stade on a donc le schéma suivant :

Image non disponible








IV-B. La Vue

Maintenant qu'on a créé le contrôleur on passe à la vue (view).
Sous le répertoire /views on crée le répertoire "scripts" puis on crée un autre répertoire index (views/scripts/index), en dernier on crée le fichier index.phtml.
On remarque qu'il y a le nom index qui se répète :

  • IndexController.php
  • views/scripts/index
  • views/scripts/index/index.phtml
index.phtml
Sélectionnez

<?php
  echo 'Mes premiers pas vers Zend Framework' ; 
?>

Apres exécution on obtient le résultat suivant http://localhost/ZfTutDebutant/www/index.php

Image non disponible

Image non disponible

IV-C. Le Model

On commence par créer une base nommée "zftutdebutant" et une table "utilisateurs"

 
Sélectionnez

CREATE TABLE IF NOT EXISTS `utilisateurs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(30) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

INSERT INTO `utilisateurs` (`id`, `nom`, `age`) VALUES
(1, 'Timmy Mellowman', 23),
(2, 'Sandy Smith', 21),
(3, 'Bobby Wallace', 15);				
				

Il y a plusieurs façons d'implémenter la connexion à la base, dans ce tutoriel j'ai abordé la connexion à travers un fichier ini mais il est possible de faire différemment. Sous le répertoire "www" on crée un répertoire "config" sous ce même répertoire on crée le fichier "config.ini" (/www/config/config.ini).

config.ini
Sélectionnez

[dev]
database.adapter = pdo_mysql
database.params.host = 127.0.0.1
database.params.username = root
database.params.password = 
database.params.dbname =  ZfTutDebutant

On doit configurer la connexion dans le fichier d'amorçage, donc il faut rajouter ce bloc dans le fichier index.php juste avant le try.

index.php
Sélectionnez

<?php

/*On peut charger les classes à utiliser manuellement dans 
ce cas pas besoin de la classe "Zend_Loader_Autoloader". 
Zend_Loader::loadClass ( 'Zend_Config_Ini' );
Zend_Loader::loadClass ( 'Zend_Registry' );
Zend_Loader::loadClass ( 'Zend_Db' );
Zend_Loader::loadClass ( 'Zend_Db_Table' );*/


// $configPath sera reprise sous forme de tableau   
$configPath = '../www/config/config.ini'; 
// Création d'un objet à partir du fichier  ini  
$config = new Zend_Config_Ini ( $configPath, 'dev' );


// Construction d'un objet $db permettant d'utiliser la base de données
$db = Zend_Db::factory ( $config->database );


// Si on  veut  forcer l'adaptateur à se connecter au SGBD, on utilise sa méthode 
// getConnection(),elle retournera alors un objet représentant la connexion en fonction de 
// l'extension PHP utilisée, ou une exception si la connexion n'a pas été réalisée. 
// Par exemple, si notre adaptateur utilise PDO, le retour sera un objet PDO. 
$db->getConnection ();


//Un registre est un conteneur pour stocker des objets et des valeurs dans l'espace d'application. 
//En stockant la valeur dans le registre, le même objet est toujours disponible partout dans 
//votre application. Ce mécanisme est une alternative à l'utilisation du stockage global. 
Zend_Registry::set ( 'db', $db );


// BD par default 
Zend_Db_Table::setDefaultAdapter ( $db );
?>

Notre fichier index devient le suivant :

index.php
Sélectionnez

<?php
//on définit le chemin de notre application
define ( 'APPLICATION_PATH', realpath ( dirname ( __FILE__ ) . '/../' ) );

//on définit le chemin de notre librairie
$library = APPLICATION_PATH. '/library';
set_include_path ($library . PATH_SEPARATOR . get_include_path ());

//La classe Zend_Loader_Autoloader inclut des méthodes afin de nous 
//aider à charger des fichiers dynamiquement.

require_once 'Zend/Loader/Autoloader.php';
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('App_');


/*On peut charger les classes à utiliser manuellement dans 
ce cas pas besoin de la classe "Zend_Loader_Autoloader". 

Zend_Loader::loadClass ( 'Zend_Controller_Front' );
Zend_Loader::loadClass ( 'Zend_Config_Ini' );
Zend_Loader::loadClass ( 'Zend_Registry' );
Zend_Loader::loadClass ( 'Zend_Db' );
Zend_Loader::loadClass ( 'Zend_Db_Table' );*/


//$configPath sera reprise sous forme de tableau   
$configPath = '../www/config/config.ini';

//Création d'un objet à partir du fichier ini  
$config = new Zend_Config_Ini ( $configPath, 'dev' );


//Construction d'un objet $db permettant d'utiliser la base de données
$db = Zend_Db::factory ( $config->database );


//Si on  veut  forcer l'adaptateur à se connecter au SGBD, on utilise sa méthode 
//getConnection(),elle retournera alors un objet représentant la connexion en fonction de 
//l'extension PHP utilisée, ou une exception si la connexion n'a pas été réalisée. 
//Par exemple, si notre adaptateur utilise PDO, le retour sera un objet PDO. 
$db->getConnection ();


//Un registre est un conteneur pour stocker des objets et des valeurs dans l'espace d'application. 
//En stockant la valeur dans le registre, le même objet est toujours disponible partout dans 
//votre application Ce mécanisme est une alternative à l'utilisation du stockage global. 
Zend_Registry::set ( 'db', $db );


// BD par default 
Zend_Db_Table::setDefaultAdapter ( $db );

	
try {
    
    //getInstance() est utilisé pour récupérer une instance du contrôleur frontal. 
	$front = Zend_Controller_Front::getInstance();
	
	//le contrôleur frontal renvoie les exceptions qu'il a rencontrées 
    //à l'objet de réponse, nous offrant une possibilité élégante de les gérer.
	$front->throwExceptions(true);
	
	//setControllerDirectory() est utilisé
	//chercher les fichiers de
	//classes de contrôleurs d'action.
	$front->setControllerDirectory(APPLICATION_PATH . '/application/controllers');
	
	//Dispatch lance notre application, fait le gros travail du contrôleur frontal. 
	//Il peut facultativement prendre un objet de requête et/ou un objet de réponse,
	//permettant ainsi au développeur de fournir des objets personnalisés.
	$front->dispatch();
	
	// Traite les exceptions du contrôleur  (généralement 404)
} catch (Zend_Controller_Exception $e) {
	include 'errors/404.phtml';
	// Traite les autres exceptions du contrôleur 
} catch (Exception $e) {
	include 'errors/500.phtml';
}
?>

Puis on crée la classe qui va interroger la base et nous acheminer le résultat au sein du contrôleur, sous le répertoire models il faut créer le fichier "Utilisateurs.php" :

Utilisateurs.php
Sélectionnez

<?php
require_once 'Zend/Db/Table/Abstract.php';
class Utilisateurs extends Zend_Db_Table_Abstract
{
    protected $_name = 'utilisateurs';
    
}
?>

zend_Db_Table_Abstract est comme son nom l'indique une classe abstraite. Elle représente au sens large une table d'une base de données.
Utilisateurs extends Zend_Db_Table_Abstract la définition de cette classe prendra en charge toutes les caractéristiques de la table Utilisateurs et on fera ainsi pour toutes les tables de la base que l'on veut représenter.

Pour récupérer nos données dans le fichier "IndexController.php" il faut cependant insérer les lignes suivantes au sein du fichier IndexController.php

IndexController.php
Sélectionnez

<?php
require_once '../application/models/Utilisateurs.php';
class IndexController extends Zend_Controller_Action
{
	public function indexAction()
	{
    $user = new Utilisateurs ;
    $this->view->user = $user->fetchall()->toArray(); 

	}
}
?>
Image non disponible

Enfin dans notre fichier index.phtml on affiche nos données

index.phtml
Sélectionnez

<?php
 // echo 'Mes premiers pas vers Zend Framework' ; 
 ?>
<table>
<tr>
<th>Nom</th>
<th>Age</th>
</tr>
<?php foreach ($this->user as $key => $val): ?>
<tr>
<td><?php echo $this->escape($val['nom']) ?></td>
<td><?php echo $this->escape($val['age']) ?></td>
</tr>
<?php endforeach; ?>
</table>






Résultat :

Image non disponible

V. Conclusion

Ce tutoriel s'adresse aux débutants souhaitant avoir une prise en main facile, rapide ainsi qu'une familiarisation avec Zend Framework. Pour avancer avec d'autres composants et les méthodes d'implémentation vous pouvez consultez le site officiel.

V-A. Remerciment

Je tiens à remercier infiniment Yogui pour ses conseils et mlny84 pour sa relecture.

36 commentaires Donner une note à l'article (5)