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 :
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.
<?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.
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).
<?php
class
IndexController extends
Zend_Controller_Action
{
public
function
indexAction()
{
}
}
?>
À ce stade on a donc le schéma suivant :
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
<?php
echo 'Mes premiers pas vers Zend Framework'
;
?>
Apres exécution on obtient le résultat suivant http://localhost/ZfTutDebutant/www/index.php
IV-C. Le Model▲
On commence par créer une base nommée "zftutdebutant" et une table "utilisateurs"
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).
[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.
<?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 :
<?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" :
<?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
<?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();
}
}
?>
Enfin dans notre fichier index.phtml on affiche nos données
<?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 :
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.