Vous êtes sur la page 1sur 26

Dmarrer avec Zend Framework 2

Par Rob Allen (auteur)

- Philippe Peso (traducteur) - philippe.peso (traducteur)

Date de publication : 20 juin 2012

Ce tutoriel a t rdig pour vous prsenter Zend Framework 2 en crant une application
base sur une base de donnes basique et utilisant une conception Modle-Vue-Contrleur.
Aprs la lecture de ce document, vous aurez une application ZF2 fonctionnelle et vous
pourrez examiner le code pour en comprendre le fonctionnement et les mcanismes.
Note : ce tutoriel est bas sur la version beta 4 de Zend Framework 2. Il peut fonctionner
sur une version plus rcente, mais ne fonctionnera pas sur une version antrieure.
Cet article a t publi avec l'aimable autorisation de Rob Allen. L'article original peut tre
lu sur son site : http://akrabat.com/zend-framework-2-tutorial/.

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Prrequis...................................................................................................................................................................... 3
L'application du tutoriel................................................................................................................................................ 3
Dmarrage : l'application squelette..............................................................................................................................3
Dmarrer avec un fichier zip..................................................................................................................................4
Virtual host................................................................................................................................................................... 4
Modules........................................................................................................................................................................ 5
Configuration du module Album.................................................................................................................................. 5
Autochargement des fichiers..................................................................................................................................6
Configuration................................................................................................................................................................ 7
Informer l'application du nouveau module...................................................................................................................7
Les pages du site........................................................................................................................................................ 8
Crer le contrleur....................................................................................................................................................... 9
Initialiser les vues...................................................................................................................................................... 10
La base de donnes..................................................................................................................................................11
Les fichiers du modle.............................................................................................................................................. 11
Utiliser le ServiceManager pour configurer les identifiants de la base de donnes et le passer au contrleur......... 13
Lister les albums........................................................................................................................................................15
Les styles..............................................................................................................................................................17
Ajouter de nouveaux albums..................................................................................................................................... 17
diter un album..........................................................................................................................................................22
Supprimer un album.................................................................................................................................................. 23
Faire en sorte que la page d'accueil affiche la liste des albums.............................................................................. 25
Conclusion et remerciements.................................................................................................................................... 25

-2Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Prrequis
Ce tutoriel part du principe que vous utilisez PHP 5.3.10, avec un serveur Web Apache et une base de donnes
MySQL, accessible par l'extension PDO. Vous devez avoir install et activ l'extension mod_rewrite.
Vous devez galement vous assurer qu'Apache est configur pour supporter les fichiers .htaccess. Pour cela vous
pouvez changer la directive
AllowOverride None

en
AllowOverride All

dans votre fichier httpd.conf. Consultez la documentation de votre serveur Web pour plus de renseignements. Vous
ne pourrez naviguer sur aucune page, part la page d'accueil, si vous n'avez pas activ le mod_rewrite et bien
complt le fichier .htaccess.

L'application du tutoriel
Nous allons crer une application qui affichera un systme de gestion de nos albums. La page principale listera notre
collection d'albums et nous permettra d'en ajouter, de les diter et de supprimer des CD. Nous aurons besoin de
quatre pages sur le site :
Liste des albums
Ajout d'un nouvel album
dition d'un album
Suppression d'un album

Cette page affichera la liste des albums,


avec des liens pour les diter et les
supprimer, et pour en ajouter un nouveau.
Cette page affichera un formulaire d'ajout
d'un nouvel album.
Cette page affichera un formulaire d'dition
d'un album.
Cette page permettra la confirmation de
la suppression d'un album et fera cette
suppression.

Nous aurons galement besoin de stocker les donnes dans une base de donnes. Nous n'aurons besoin que d'une
table, avec ces colonnes :
Nom du champ
id

Type
integer

Null ?
Non

artist
title

varchar(100)
varchar(100)

Non
Non

Notes
Cl primaire, autoincrment

Dmarrage : l'application squelette


Il y a deux faons de dmarrer. Si vous tes a l'aise avec git, utilisez-le, sinon lisez la section Dmarrer avec un
fichier zip.

-3Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Dmarrer avec un fichier zip


Afin de crer notre application, nous allons tlcharger le ZendSkeletonApplication, disponible sur github.
Allez https://github.com/zendframework/ZendSkeletonApplication et cliquez sur le bouton "Zip". Vous
tlchargerez un fichier nomm zendframework-ZendSkeletonApplication-zfrelease-2.0.0beta4-7-g1dad749.zip ou
un nom ressemblant.
Dzippez ce fichier dans le rpertoire dfini dans le vhost et renommez le rpertoire obtenu en zf2-tutorial.
Le ZendSkeletonApplication utilise Composer pour trouver les dpendances, dans notre cas, la dpendance est
Zend Framework 2 lui-mme.
Pour installer Zend Framework 2 dans votre application, vous devez simplement taper :
php composer.phar install

depuis le rpertoire zf2-tutorial. Cela peut prendre un certain temps. Vous obtiendrez un rsultat ressemblant ceci :
Installing dependencies from lock file
- Installing zendframework/zendframework (dev-master)
Cloning cef2f9c90a9dc3fe3018b624ff9113666a397b73
Generating autoload files

Nous pouvons dsormais passer au virtual host.

Virtual host
Nous allons crer un virtual host Apache pour l'application, en ditant le fichier hosts pour que l'adresse http://zf2tutorial.localhost pointe sur le fichier index.php du rpertoire zf2-tutorial/public.
La configuration du virtual host est gnralement faite dans le fichier httpd.conf ou extra/httpd-vhosts.conf (si vous
utilisez httpd-vhosts.conf, assurez-vous que ce fichier est charg par le fichier principal httpd.conf).
Assurez-vous galement que NameVirtualHost est dfini "*:80" ou une configuration similaire, ensuite dfinissez
le virtual host ainsi :
<VirtualHost *:80>
ServerName zf2-tutorial.localhost
DocumentRoot /path/to/zf-2tutorial/public
SetEnv APPLICATION_ENV "development"
<Directory /path/to/zf2-tutorial/public>
DirectoryIndex index.php
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

Pensez mettre jour le fichier /etc/hosts ou c:\windows\system32\drivers\etc\hosts avec la relation zf2tutorial.localhost associe 127.0.0.1. Le site est alors accessible l'adresse http://zf2-tutorial.localhost.
Si vous n'avez pas fait d'erreur, vous devriez voir une page ressemblant celle-ci :

-4Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Pour vrifier que le fichier .htaccess fonctionne bien, allez la page http://zf2-tutorial.localhost/1234, vous devriez
voir ceci :

Si vous voyez l'erreur Apache 404, vous devez corriger le fichier .htaccess avant de poursuivre.
Vous avez dsormais une application squelette fonctionnelle, nous allons pouvoir nous occuper de notre application.

Modules
Zend Framework 2 utilise un systme de modules, o vous placez un code spcifique au module. Le module
Application du squelette est utilis pour fournir le bootstrap, la configuration des erreurs et du routage, toute
l'application. Il est gnralement utilis pour fournir les contrleurs de l'application, comme sa page d'accueil, mais
nous n'allons pas utiliser celui qui est fourni par dfaut dans l'application. Notre page listant les albums aura son
propre module.
Nous allons mettre tout notre code dans le module Album, qui contiendra nos contrleurs, nos modles, nos
formulaires, nos vues et les fichiers de configuration. Commenons par les rpertoires.

Configuration du module Album


Commencez par crer un rpertoire nomm Album en respectant cette arborescence pour organiser les fichiers du
module :
zf2-tutorial/
/module
/Album
/config
/src
/Album
/Controller
/Form
/Model
/view
/album

Comme vous pouvez le voir, le module Album a des rpertoires pour les diffrents types de fichiers. Les fichiers PHP
qui contiennent les classes du namespace Album sont dans le rpertoire src/Album ce qui permet d'avoir plusieurs

-5Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

espaces de nom dans ce module. Le rpertoire view a galement un sous-rpertoire nomm album pour les vues
du module.
Afin de charger et configurer un module, Zend Framework 2 a un ModuleManager. Celui-ci cherchera le fichier
Module.php la racine du rpertoire du module et s'attend y trouver une classe nomme Album\Module. La classe
d'un module donn aura l'espace de nom et le nom du module, cela sera galement le nom du rpertoire du module.
Crez le fichier Module.php dans le module Album :
module/Album/Module.php
<?php
namespace Album;
class Module
{
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\ClassMapAutoloader' => array(
__DIR__ . '/autoload_classmap.php',
),
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}

public function getConfig()


{
return include __DIR__ . '/config/module.config.php';
}

Le ModuleManager appellera getAutoloaderConfig() et getConfig() automatiquement pour nous.

Autochargement des fichiers


Notre mthode getAutoloaderConfig() retourne un tableau, ce qui est compatible avec l'AutoloaderFactory de
ZF2. Nous allons le configurer, en ajoutant un fichier de classe gnrale (class map) au ClassmapAutoloader et
ajouter l'espace de nom du module au StandardAutoloader. L'autoloader standard a besoin d'un espace de nom
et du chemin ncessaire pour trouver les fichiers de cet espace. Ceci est conforme au standard PSR-0, avec les
classes qui correspondent directement aux fichiers des rgles PSR-0. Voir ce site pour plus d'information : https://
gist.github.com/1293323.
Comme nous sommes en environnement de dveloppement, nous n'avons pas besoin de charger ces fichiers par la
carte de classe. Nous pouvons donc mettre un tableau vide pour l'autoloader. Crez un fichier autoload_classmap.php
en le remplissant ainsi :
module/Album/autoload_classmap.php
<?php
return array();

Avec un tableau vide, chaque fois que l'autoloader cherche une classe dans l'espace de nom Album, il retombera
sur le StandardAutoloader.

-6Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Notez qu'en utilisant Composer en tant qu'alternative, vous ne pouvez pas implmenter
getAutoloaderConfig() et ajouter la place "Application": "module/Application/src" la cl
psr-0 du composer.json. Si vous prfrez cette faon de faire, vous devez lancer php
composer.phar update pour mettre jour les fichiers d'autochargement du composer.

Configuration
Aprs avoir configur l'autoloader, jetons un il la mthode getConfig() dans Album\Module. Cette mthode charge
seulement le fichier config/module.config.php.
Crez ce fichier de configuration dans le module Album :
module/Album/config/module.config.php
<?php
return array(
'controller' => array(
'classes' => array(
'album/album' => 'Album\Controller\AlbumController',
),
),
'view_manager' => array(
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
);

Les informations de configuration sont transmises aux composants appropris par le ServiceManager. Nous avons
besoin de deux sections initiales : controller et view_manager. La section controller fournit une liste de tous les
contrleurs appels par le module. Nous n'aurons besoin que d'un contrleur, AlbumController, que nous nommons
album/album. Cette cl doit tre unique dans tous les modules, c'est pourquoi nous la prfixons avec le nom du
module.
Dans la section view_manager, nous ajoutons le rpertoire de la vue la cl TemplatePathStack. Ceci permettra de
trouver les scripts de vue du module Album qui sont stocks dans le rpertoire views/album.

Informer l'application du nouveau module


Nous allons maintenant informer le ModuleManager de l'existence du nouveau module en modifiant le fichier config/
application.config.php fourni par le squelette de l'application. Ajoutez dans la section modules l'entre Album pour
que votre fichier ressemble ceci :
config/application.config.php

<?php
return array(
'modules' => array(
'Application',
'Album',
),
'module_listener_options' => array(
'config_glob_paths' => array(
'config/autoload/{,*.}{global,local}.php',
),
'config_cache_enabled' => false,
'cache_dir' => 'data/cache',
'module_paths' => array(
'./module',
'./vendor',
),
),

-7Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

config/application.config.php

);

'service_manager' => array(


'use_defaults' => true,
'factories' => array(
),
),

Comme vous pouvez le voir, nous avons ajout notre module Album dans la liste des modules, aprs le module
Application. Nous pouvons dsormais crer notre code pour le module.

Les pages du site


Nous allons construire un systme basique d'affichage de notre collection d'albums. La page d'accueil listera cette
collecte et nous permettra d'ajouter, d'diter et de supprimer des albums, avec ces pages :
Accueil
Ajouter un nouvel album
diter un album
Supprimer un album

Affichera la liste des albums avec des liens


pour les diter et les supprimer, ainsi qu'un
lien pour ajouter un nouvel album.
Affichera un formulaire pour ajouter un
nouvel album.
Affichera un formulaire pour supprimer un
album.
Permettra de confirmer et d'effectuer la
suppression d'un album.

Avant de crer ces fichiers, il faut bien comprendre comment le framework gre l'organisation des pages. Chaque
page de l'application reprsente une action et les actions sont regroupes dans les contrleurs, eux-mmes dans
des modules. Par exemple, un contrleur actualites aurait des actions actuelles, archivees et vues
Nous avons donc quatre pages pour grer nos albums, nous allons les regrouper dans un seul contrleur nomm
AlbumController, lui-mme dans le module Album. Ce contrleur aura quatre actions, qui seront :
Page
Accueil
Ajouter un nouvel album
diter un album
Supprimer un album

Contrleur
AlbumController
AlbumController
AlbumController
AlbumController

Action
index
add
edit
delete

La cration de l'URL vers une action particulire est effectue en utilisant les routes dfinies dans le fichier
module.config.php du module. Nous allons ajouter une route pour toutes nos actions. Voici le fichier mis jour :
module/Album/config/module.config.php
<?php
return array(
'controller' => array(
'classes' => array(
'album/album' => 'Album\Controller\AlbumController',
),
),
'router' => array(
'routes' => array(
'album' => array(
'type' => 'segment',
'options' => array(
'route' => '/album[/:action][/:id]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
-8Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

module/Album/config/module.config.php

),

);

'id' => '[0-9]+',


),
'defaults' => array(
'controller' => 'album',
'action' => 'index',
),

),

),
),
'view_manager' => array(
'template_path_stack' => array(
__DIR__ . '/../view',
),
),

Le nom de la route est album et est form de segments, qui nous permettent de spcifier des zones de paramtres
dans l'URL, qui devront correspondre avec le nom des paramtres de la route. Dans notre cas, la route est /
album[/:action][/:id] et correspond n'importe quelle URL dmarrant par /album. Le segment suivant sera le nom
facultatif de l'action et le dernier segment correspond l'id, galement facultatif. Les crochets indiquent que le
segment est facultatif. Ces contraintes nous assurent que les caractres des segments correspondent un format
attendu. Nous forons le nom de l'action dmarrer par une lettre, suivie de caractres alphanumriques, de tirets
bas ( _ ) ou de tirets hauts ( - ) uniquement. Pour l'id, ce doit tre un nombre.
Cette route nous permet d'obtenir les URL suivantes :
URL
/album
/album/add
/album/edit/2
/album/delete/4

Page
Page d'accueil (liste des
albums)
Ajout d'un nouvel album
Edition de l'album ayant l'id 2
Suppression de l'album ayant
l'id 4

Action
index
add
edit
delete

Crer le contrleur
Nous sommes maintenant prts complter le contrleur. Avec Zend Framework 2, le contrleur est une classe
qui est gnralement appele {Controller name}Controller. Notez que {Controller name} doit commencer par une
majuscule. Cette classe doit tre place dans un fichier nomm {Controller name}Controller.php et tre dans le
rpertoire Controller du module. Dans notre cas le rpertoire est module/Album/src/Album/Controller. Chaque action
du contrleur doit tre une mthode publique et doit tre nomme {action name}Action. {action name} doit commencer
par une minuscule.
Ces rgles sont des conventions. Zend Framework 2 ne vous impose pas d'autre restriction que d'implmenter
l'interface Zend\Stdlib\Dispatchable. Le framework fournit deux classes abstraites qui font cela notre place : Zend
\Mvc\Controller\ActionController et Zend\Mvc\Controller\RestfulController. Nous utiliserons le contrleur standard
ActionController, mais si vous souhaitez utiliser un service Web RESTful, RestfulController vous sera plus utile.
Maintenant, crons notre contrleur :
module/Album/src/Album/Controller/AlbumController.php
<?php
namespace Album\Controller;
use Zend\Mvc\Controller\ActionController,
Zend\View\Model\ViewModel;

-9Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

module/Album/src/Album/Controller/AlbumController.php
class AlbumController extends ActionController
{
public function indexAction()
{
}
public function addAction()
{
}
public function editAction()
{
}
public function deleteAction()
{
}
}

Notez que nous avons dj inform le module de l'existence du contrleur dans la section controller du fichier config/
module.config.php.
Nous avons dsormais dfini les actions que nous voulons utiliser. Elles ne fonctionneront pas tant que nous n'aurons
pas dfini les vues. Les URL de chaque action sont :
URL
http://zf2-tutorial.localhost/album
http://zf2-tutorial.localhost/album/add
http://zf2-tutorial.localhost/album/edit
http://zf2-tutorial.localhost/album/delete

Mthode appele
Album\Controller
\AlbumController::indexAction()
Album\Controller
\AlbumController::addAction()
Album\Controller
\AlbumController::editAction()
Album\Controller
\AlbumController::deleteAction()

Nous avons dsormais un routeur fonctionnel et les actions sont dfinies pour chaque page de notre application. Il
est temps de construire les vues et la couche du modle.

Initialiser les vues


Pour intgrer les vues dans l'application, nous devons crer les scripts de vue. Ces fichiers seront excuts par l'objet
ViewListener dans le module Application et transmettront les variables qui sont retournes par l'action du contrleur.
Ces vues sont places dans le rpertoire views du module, dans un rpertoire portant le mme nom que le contrleur.
Crez ces quatre fichiers vides :

Module/Album/view/album/album/index.phtml ;
Module/Album/view/album/album/add.phtml ;
Module/Album/view/album/album/edit.phtml ;
Module/Album/view/album/album/delete.phtml.

Nous pouvons dsormais crer les donnes, en commenant par la base de donnes et les modles.

- 10 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

La base de donnes
ce stade nous avons le module Album avec un contrleur, des actions, et des vues. Nous allons nous intresser
la partie des modles de notre application. Rappelez-vous que le modle est la partie qui communique avec le cur
de l'application (ce qu'on l'appelle gnralement les rgles mtier ) et, dans notre cas, les relations avec la base
de donnes. Nous allons utiliser la classe Zend\Db\TableGateway\TableGateway qui est utile pour trouver, insrer,
mettre jour et supprimer des lignes des tables d'une base de donnes.
Nous allons utiliser MySQL et son extension PDO pour crer une base de donnes nomme zf2tutorial et lancer ces
requtes SQL pour crer la table album et son contenu.
CREATE TABLE album (
id int(11) NOT NULL auto_increment,
artist varchar(100) NOT NULL,
title varchar(100) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO album (artist, title)
VALUES ('The Military Wives', 'In My Dreams');
INSERT INTO album (artist, title)
VALUES ('Adele', '21');
INSERT INTO album (artist, title)
VALUES ('Bruce Springsteen', 'Wrecking Ball (Deluxe)');
INSERT INTO album (artist, title)
VALUES ('Lana Del Rey', 'Born To Die');
INSERT INTO album (artist, title)
VALUES ('Gotye', 'Making Mirrors');

(Ces donnes de test ont t choisies parce qu'elles faisaient partie des meilleures ventes sur Amazon UK lorsque
ce tutoriel a t crit !)
Nous avons maintenant des donnes dans la base et pouvons passer la cration d'un modle basique.

Les fichiers du modle


Zend Framework ne fournit pas un composant Zend\Model en tant que modle logique, c'est vous de dcider
comment vous voulez qu'il fonctionne. Il y a plusieurs composants qui peuvent tre choisis, cela dpend de vos
besoins. Une des approches possibles est d'avoir des classes faisant office de modles, chacune reprsentant une
entit de l'application et d'utiliser ces objets pour charger et enregistrer les entits en base de donnes. Une autre
mthode possible : utiliser un ORM comme Doctrine ou Propel.
Pour ce tutoriel, nous allons crer un modle simplifi, en crant une classe AlbumTable qui tend Zend\Db
\TableGateway\TableGateway, o chaque objet de l'album est un objet Album (aussi appel entit). Ceci est une
implmentation du modle de conception Table Data Gateway, ce qui permet de crer une interface (passerelle)
avec les donnes de la base de donnes. Faites bien attention au pattern de Table Data Gateway, qui peut avoir des
limites sur certains systmes. Vous pouvez aussi tre tents d'tablir l'accs la base de donnes depuis l'action
d'un contrleur puisqu'elles sont lies au Zend\Db\TableGateway\AbstractTableGateway. Ne faites jamais cela !
Commenons par l'entit Album du rpertoire Model :
module/Album/src/Album/Model/Album.php
<?php
namespace Album\Model;
use Zend\Db\ResultSet\Row;
class Album extends Row
{}
- 11 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Nous dfinissons simplement une classe vide, qui tend l'objet Row. Nous ajouterons un filtre de saisie pour nos
formulaires un peu plus loin.
Puis nous allons crer notre propre classe AlbumTable qui tendra la classe Zend\Db\TableGateway
\AbstractTableGateway du rpertoire Model, comme ceci :
module/Album/src/Album/Model/AlbumTable.php
<?php
namespace Album\Model;
use Zend\Db\TableGateway\AbstractTableGateway,
Zend\Db\Adapter\Adapter,
Zend\Db\ResultSet\ResultSet;
class AlbumTable extends AbstractTableGateway
{
protected $table ='album';
protected $tableName ='album';
public function __construct(Adapter $adapter)
{
$this->adapter = $adapter;
$this->resultSetPrototype = new ResultSet(new Album);
$this->initialize();
}
public function fetchAll()
{
$resultSet = $this->select();
return $resultSet;
}
public function getAlbum($id)
{
$id = (int) $id;
$rowset = $this->select(array('id' => $id));
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $id");
}
return $row;
}
public function saveAlbum(Album $album)
{
$data = array(
'artist' => $album->artist,
'title' => $album->title,
);
$id = (int)$album->id;

if ($id == 0) {
$this->insert($data);
} else {
if ($this->getAlbum($id)) {
$this->update($data, array('id' => $id));
} else {
throw new \Exception('Form id does not exist');
}
}

public function addAlbum($artist, $title)


{
$data = array(
'artist' => $artist,
'title' => $title,
);

- 12 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

module/Album/src/Album/Model/AlbumTable.php
}

$this->insert($data);

public function updateAlbum($id, $artist, $title)


{
$data = array(
'artist' => $artist,
'title' => $title,
);
$this->update($data, array('id' => $id));
}
public function deleteAlbum($id)
{
$this->delete(array('id' => $id));
}
}

C'est un assez gros morceau... Tout d'abord nous avons dfini les proprits protected table et tableName avec le
nom de la table de la base de donnes, album dans notre cas. Nous ajoutons ensuite un constructeur qui prend
comme seul paramtre l'adapter de la base de donnes et nous l'assignons la proprit adapter de notre classe.
Nous devons ensuite renseigner les donnes de chaque nouvel objet Album cr avec les donnes de la table. Les
classes TableGateway utilisent un modle de prototype pour crer les jeux de donnes et les entits. Cela signifie
qu' la place d'instancier un objet quand on en a besoin, le systme clone le dernier objet instanci. Pour plus de
dtails, visitez ce site.
Nous crons ensuite cinq mthodes helper pour que notre application utilise l'interface pour accder la table
de la base de donnes.

fetchAll() remonte tous les albums de la base de donnes, c'est un objet de type ResultSet ;
getAlbum() remonte un seul album, c'est un objet de type Row ;
addAlbum() cre une nouvelle ligne dans la base de donnes ;
updateAlbum() met jour un album ;
deleteAlbum() supprime compltement une ligne.

Le code de chaque mthode parle normalement de lui-mme.

Utiliser le ServiceManager pour configurer les identifiants de la base de donnes et le passer


au contrleur
Pour toujours utiliser la mme instance de notre AlbumTable, nous allons utiliser le ServiceManager pour en
crer une. C'est relativement facile faire dans la classe Module o nous avons cr une mthode nomme
getServiceConfiguration() , qui est automatiquement appele par le ModuleManager et applique au ServiceManager.
Nous sommes dsormais capables de la retrouver depuis le contrleur ds que nous avons besoin.
Pour configurer le ServiceManager nous pouvons fournir le nom de la classe instancier, ou une fabrique (closure
ou callback) qui instancie l'objet quand le ServiceManager en a besoin. Nous commenons par implmenter
getServiceConfiguration() pour fournir une fabrique qui va crer l'AlbumTable. Ajoutez cette mthode la fin de la
classe Module.
module/Album/Module.php
<?php
namespace Album;
use Album\Model\AlbumTable;
class Module

- 13 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

module/Album/Module.php
{

// getAutoloaderConfig() and getConfig() methods here


public function getServiceConfiguration()
{
return array(
'factories' => array(
'album-table' => function($sm) {
$dbAdapter = $sm->get('db-adapter');
$table = new AlbumTable($dbAdapter);
return $table;
},
),
);
}
}

Cette mthode retourne un tableau de factories qui sont fusionnes par le ModuleManager avant d'tre passes
au ServiceManager. Nous avons galement besoin d'crire une fabrique ( factory ) pour instancier l'adapter de
notre base de donnes. En tant que service de l'application, nous faisons cela dans la classe Module du module
Application :
module/Application/Module.php
<?php
namespace Application;
use Zend\Db\Adapter\Adapter as DbAdapter;
class Module
{
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}

public function getServiceConfiguration()


{
return array(
'factories' => array(
'db-adapter' => function($sm) {
$config = $sm->get('config');
$config = $config['db'];
$dbAdapter = new DbAdapter($config);
return $dbAdapter;
},
),
);
}

Dans la fonction getServiceConfiguration() du module Application, nous chargeons la configuration de la base de


donnes depuis la fusion des configurations et l'utilisons pour instancier notre DbAdapter. Le ModuleManager de
Zend Framework 2 fusionne toutes les configurations de chaque module prsent dans les fichiers module.config.php
des modules et fusionne ensuite les fichiers prsents dans config/autoload (fichiers *.global.php puis *.local.php).
Nous ajoutons la configuration de la base de donnes au fichier global.php, que vous pouvez commiter avec votre
gestionnaire de versioning. Vous pouvez utiliser le fichier local.php (pas commit dans le gestionnaire de versioning)
pour stocker les identifiants de votre base de donnes si vous le souhaitez.
config/autoload/global.php
return array(
'db' => array(
'driver' => 'Pdo',
- 14 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

config/autoload/global.php

);

),

'dsn' => 'mysql:dbname=zf2tutorial;hostname=localhost',


'username' => 'rob',
'password' => '123456',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),

Pensez mettre vos propres identifiants dans ce tableau !


Maintenant que le ServiceManager peut crer une instance de AlbumTable notre place, nous pouvons ajouter une
mthode pour la retrouver. Ajoutez la mthode getAlbumTable() la classe AlbumController :
module/Album/src/Album/Controller/AlbumController.php
public function getAlbumTable()
{
if (!$this->albumTable) {
$sm = $this->getServiceLocator();
$this->albumTable = $sm->get('album-table');
}
return $this->albumTable;
}

N'oubliez pas d'ajouter au dbut de votre classe :


protected $albumTable;

Nous pouvons dsormais appeler la mthode getAlbumTable() depuis notre contrleur ds que nous avons besoin
d'interagir avec le modle. Poursuivons avec la liste des albums, appele par l'action index.

Lister les albums


Afin de lister les albums, nous avons besoin de les slectionner depuis le modle et de les passer la vue. Pour cela,
nous remplissons la mthode indexAction() de la classe AlbumController. Mettez jour cette mthode avec ce code :
module/Album/src/Album/Controller/AlbumController.php
/**/
public function indexAction()
{
return new ViewModel(array(
'albums' => $this->getAlbumTable()->fetchAll(),
));
}
/**/

Avec Zend Framework 2, pour pouvoir envoyer des variables la vue, il faut retourner une instance ViewModel avec
un tableau contenant les donnes ncessaires l'affichage en premier paramtre du constructeur. Ces donnes
sont passes automatiquement la vue. L'objet ViewModel permet aussi de changer le script de la vue qu'on utilise,
mais le script de vue par dfaut est nomm {controller name}/{action name}. Nous pouvons maintenant remplir le
fichier index.phtml :
module/Album/view/album/album/index.phtml
<?php
$title = 'My albums';
$this->headTitle($title);

- 15 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

module/Album/view/album/album/index.phtml
?>

<h1><?php echo $this->escape($title); ?></h1>


<p>
<a href="<?php echo $this->url('album', array('action'=>'add'));?>">Add new album</a>
</p>
<table class="table">
<tr>
<th>Title</th>
<th>Artist</th>
<th>&nbsp;</th>
</tr>
<?php foreach($albums as $album) : ?>
<tr>
<td><?php echo $this->escape($album->title);?></td>
<td><?php echo $this->escape($album->artist);?></td>
<td>
<a href="<?php echo $this->url('album', array('action'=>'edit', 'id' => $album->id));?
>">Edit</a>
<a href="<?php echo $this->url('album', array('action'=>'delete', 'id' => $album->id));?
>">Delete</a>
</td>
</tr>
<?php endforeach; ?>
</table>

La premire chose faire est de dfinir le titre de la page (utilis dans le layout), ainsi que le titre de la balise <head>
affich dans la barre du navigateur, en utilisant le helper de vue headTitle(). Nous crons ensuite un lien pour ajouter
un nouvel album.
Le helper de vue url() est fourni par Zend Framework 2 et est utilis pour crer le lien souhait. Le premier paramtre
de url() est le nom de la route que nous souhaitons utiliser pour construire l'URL. Le second paramtre est un tableau
de toutes les variables placer dans les zones de paramtres. Dans notre cas, nous avons notre route album qui
accepte deux variables en zone de paramtre : action et id.
Nous faisons pareil avec la variable $albums que nous assignons depuis l'action du contrleur. Le systme des vues
de Zend Framework 2 gre automatiquement le passage de ces variables vers le script de la vue, donc nous n'avons
pas grer le prfixage avec $this-> comme nous le faisions avec Zend Framework 1, mais rien ne vous interdit
de le faire.
Nous allons crer un tableau pour afficher chaque titre et artiste des albums, ainsi qu'un lien permettant d'diter et
de supprimer l'enregistrement. Une boucle classique foreach: est utilise pour traiter chaque album de la liste. Nous
utilisons la forme alternative, avec endforeach; c'est plus facile ainsi, plutt que d'essayer de faire correspondre des
accolades. Une nouvelle fois, le helper de vue url() est utilis pour crer les liens d'dition et de suppression.
Notez que nous utilisons toujours le helper de vue escape() pour nous protger des failles XSS.
Si vous ouvrez une page avec l'URL http://zf2-tutorial.localhost/album vous devriez voir ceci :

- 16 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Les styles
Nous avons dmarr avec SkeletonApplication, qui est une bonne base de travail, mais nous avons besoin de changer
le titre et d'enlever le message du copyright. Nous pouvons faire cela dans la vue layout.phtml du module Application :
Dans module/Application/view/layout/layout.phtml, trouvez cette ligne :
<?php echo $this->headTitle('ZF2 Skeleton Application') ?>

Et changez-la en :
<?php echo $this->headTitle('ZF2 Tutorial') ?>

Cherchez galement celle-ci :


<a class="brand" href="<?php echo $this->url('home') ?>">Skeleton Application</a>

Remplacez-la par :
<a class="brand" href="<?php echo $this->url('home') ?>">Tutorial</a>

Supprimez aussi ceci :


<p>&copy; 2006 - 2012 by Zend Technologies Ltd. All rights reserved.</p>

La page a un meilleur look dsormais !

Ajouter de nouveaux albums


Nous pouvons maintenant coder l'ajout d'un nouvel album. Il est spar en deux parties :

afficher un formulaire pour que l'utilisateur saisisse les dtails de l'album ;


traiter les donnes soumises et les enregistrer en base de donnes.

Pour cela nous utilisons Zend\Form. Le composant Zend\Form gre le formulaire et la validation. Nous ajoutons un
Zend\InputFilter notre entit Album. Nous commenons par crer une nouvelle classe Album\Form\AlbumForm qui
tend Zend\Form\Form pour dfinir notre formulaire. Vous devez mettre la classe dans le fichier AlbumForm.php du
rpertoire module/Album/src/Album/Form.
Crons ce fichier :

- 17 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

module/Album/src/Album/Form/AlbumForm.php
<?php
namespace Album\Form;
use Zend\Form\Form;
class AlbumForm extends Form
{
public function __construct()
{
parent::__construct();
$this->setName('album');
$this->setAttribute('method', 'post');
$this->add(array(
'name' => 'id',
'attributes' => array(
'type' => 'hidden',
),
));
$this->add(array(
'name' => 'artist',
'attributes' => array(
'type' => 'text',
'label' => 'Artist',
),
));
$this->add(array(
'name' => 'title',
'attributes' => array(
'type' => 'text',
'label' => 'Title',
),
));

$this->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'label' => 'Go',
'id' => 'submitbutton',
),
));

Dans le constructeur de l'AlbumForm, nous dfinissons le nom et l'attribut method du formulaire, puis nous crons
quatre lments pour l'id, l'artiste, le titre de l'album, et le bouton submit. Pour chaque lment, nous dfinissons ses
diffrents attributs, sans oublier le label correspondant.
Nous passons ensuite la validation du formulaire. Avec Zend Framework 2, elle se fait avec un filtre de saisie, qui
peut soit tre indpendant ( standalone ), soit implmenter InputFilterAwareInterface, en tant qu'entit modle.
Nous allons ajouter ce filtre de saisie l'entit Album :
module/Album/src/Album/Model/Album.php
<?php
namespace Album\Model;
use Zend\Db\ResultSet\Row;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\Factory as InputFactory;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;

- 18 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

module/Album/src/Album/Model/Album.php
class Album extends Row implements InputFilterAwareInterface
{
protected $inputFilter;
public function setInputFilter(InputFilterInterface $inputFilter)
{
throw new \Exception("Not used");
}
public function getInputFilter()
{
if (!$this->inputFilter) {
$inputFilter = new InputFilter();
$factory = new InputFactory();
$inputFilter->add($factory->createInput(array(
'name' => 'id',
'required' => true,
'filters' => array(
array('name' => 'Int'),
),
)));
$inputFilter->add($factory->createInput(array(
'name' => 'artist',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
)));
$inputFilter->add($factory->createInput(array(
'name' => 'title',
'required' => true,
'filters' => array(
array('name' => 'StripTags'),
array('name' => 'StringTrim'),
),
'validators' => array(
array(
'name' => 'StringLength',
'options' => array(
'encoding' => 'UTF-8',
'min' => 1,
'max' => 100,
),
),
),
)));
}
}

$this->inputFilter = $inputFilter;

return $this->inputFilter;

- 19 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

L'InputFilterAwareInterface dfinit deux mthodes : setInputFilter() et getInputFilter(). Nous allons seulement nous
occuper de getInputFilter(), en levant une exception setInputFilter().
Dans getInputFilter(), nous instancions un objet InputFilter et lui ajoutons les champs requis. Nous ajoutons un champ
de saisie pour chaque proprit que nous voulons filtrer ou valider. Pour le champ id, nous ajoutons un filtre Int car
nous n'acceptons que des entiers. Pour les lments texte, nous ajoutons deux filtres, StripTags et StringTrim pour
supprimer le code HTML et les espaces inutiles. Nous les dfinissons en champs obligatoires, avec un validateur
StringLength pour s'assurer que l'utilisateur ne saisit pas plus de caractres que ce qui est enregistr en base de
donnes.
Nous allons maintenant afficher le formulaire et le soumettre, depuis l'action addAction() de AlbumController :
module/Album/src/Album/Controller/AlbumController.php
/**/
use Zend\Mvc\Controller\ActionController,
Zend\View\Model\ViewModel,
Album\Model\AlbumTable,
Album\Model\Album,
Album\Form\AlbumForm;
/**/
public function addAction()
{
$form = new AlbumForm();
$form->get('submit')->setAttribute('label', 'Add');
$request = $this->getRequest();
if ($request->isPost()) {
$album = new Album();
$form->setInputFilter($album->getInputFilter());
$form->setData($request->post());
if ($form->isValid()) {
$album->populate($form->getData());
$this->getAlbumTable()->saveAlbum($album);
// Redirect to list of albums
return $this->redirect()->toRoute('album');
}
}
return array('form' => $form);
}
/**/

Aprs avoir ajout AlbumForm la liste use, on implmente addAction(). Regardons son contenu en dtail :
$form = new AlbumForm();
$form->submit->setAttribute('label', 'Add');

Nous instanciions AlbumForm et dfinissons le label du bouton submit Add. En faisant cela ici, nous pouvons
rutiliser ce formulaire et utiliser un autre label.
$request = $this->getRequest();
if ($request->isPost()) {
$album = new Album();
$form->setInputFilter($album->getInputFilter());
$form->setData($request->post());
if ($form->isValid()) {

- 20 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Si la mthode isPost() de l'objet Request renvoie true, cela signifie que le formulaire a t soumis, donc nous activons
le filtre de saisie de l'instance de l'album. Nous valuons ensuite les donnes postes et vrifions si elles sont valides,
avec la mthode isValid().
// Redirect to list of albums
return $this->redirect()->toRoute('album');

Aprs avoir sauvegard l'album, nous redirigeons l'utilisateur vers la liste des albums avec le plugin Redirect du
contrleur.
return array('form' => $form);

Nous retournons enfin les variables que nous voulons assigner la vue. Dans notre cas, nous passons l'objet du
formulaire. Notez que Zend Framework 2 nous permet de retourner un tableau avec les variables assigner la vue,
ce qui crera un ViewModel. Cela est plus rapide crire.
Nous allons maintenant afficher le rendu du formulaire, dans la vue add.phtml :
module/Album/view/album/album/add.phtml
<?php
$title = 'Add new album';
$this->headTitle($title);
?>
<h1><?php echo $this->escape($title); ?></h1>
<?php
$form = $this->form;
$form->setAttribute('action', $this->url('album', array('action' => 'add')));
echo $this->form()->openTag($form);
?>
<dl class="zend_form">
<?php echo $this->formInput($form->get('id')); ?>
<dt><?php echo $this->formLabel($form->get('title')); ?></dt>
<dd><?php
echo $this->formInput($form->get('title'));
echo $this->formElementErrors($form->get('title'));
?></dd>
<dt><?php echo $this->formLabel($form->get('artist')); ?></dt>
<dd><?php
echo $this->formInput($form->get('artist'));
echo $this->formElementErrors($form->get('artist'));
?></dd>
<dd><?php
echo $this->formInput($form->get('submit'));
echo $this->formElementErrors($form->get('submit'));
?></dd>
</dl>
<?php echo $this->form()->closeTag($form); ?>

nouveau, nous affichons le titre puis nous affichons le formulaire. Zend Framework fournit des helpers de vue qui
nous facilitent la tche. Le helper form() possde des mthodes openTag() et closeTag() que nous utilisons pour les
balises d'ouverture et de fermeture du formulaire. Puis, pour chaque lment, nous utilisons formLabel(), formInput()
et formElementErrors(). Le reste n'est que du HTML basique. Dans ce tutoriel, j'ai utilis une liste de dfinition.

- 21 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Nous pouvons maintenant utiliser le lien Add new album de la page d'accueil pour ajouter un nouvel album la liste.

diter un album
diter un album est pratiquement la mme chose qu'en ajouter un, le code est trs ressemblant. Cette fois nous
utilisons la mthode editAction() de l'AlbumController :
module/Album/src/Album/AlbumController.php
/**/
public function editAction()
{
$id = (int)$this->getEvent()->getRouteMatch()->getParam('id');
if (!$id) {
return $this->redirect()->toRoute('album', array('action'=>'add'));
}
$album = $this->getAlbumTable()->getAlbum($id);
$form = new AlbumForm();
$form->bind($album);
$form->get('submit')->setAttribute('label', 'Edit');
$request = $this->getRequest();
if ($request->isPost()) {
$form->setData($request->post());
if ($form->isValid()) {
$this->getAlbumTable()->saveAlbum($album);
// Redirect to list of albums
return $this->redirect()->toRoute('album');
}
}

return array(
'id' => $id,
'form' => $form,
);

/**/

Ce code doit vous paratre familier. Observons les diffrences avec celui de l'ajout d'un album. Tout d'abord,
penchons-nous sur l'id qui est dans la route, nous l'utilisons pour charger l'album qui doit tre dit :
$id = (int)$this->getEvent()->getRouteMatch()->getParam('id');
if (!$id) {
return $this->redirect()->toRoute('album', array('action'=>'add'));
}
$album = $this->getAlbumTable()->getAlbum($id);

Notez que si l'id vaut zro, nous redirigeons vers l'action de l'ajout d'un album.

- 22 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

$form = new AlbumForm();


$form->bind($album);
$form->get('submit')->setAttribute('label', 'Edit');

La mthode bind() lie le modle au formulaire. On l'utilise de deux faons :


1
2

l'affichage du formulaire, les valeurs par dfaut de chaque lment sont extraites du modle ;
Aprs le succs de la validation avec la mthode isValid(), les donnes du formulaire sont rinjectes dans le
modle.

Ces oprations sont effectues par un objet hydrator . Il y a un grand nombre d'hydrators, mais celui qui est dfini
par dfaut est Zend\Stdlib\Hydrator\ArraySerializable, qui attend deux paramtres dans le modle : getArrayCopy()
et populate(). Dans notre cas, Zend\Db\ResultSet\Row les implmente notre place. Nous n'avons pas besoin de
remplir le formulaire avec les donnes car cela est fait automatiquement, nous devons juste appeler le mapper
saveAlbum() pour sauvegarder les changements dans la base de donnes.
Le template edit.phtml ressemble celui de l'ajout d'un album :
module/Album/view/album/album/edit.phtml
<?php
$title = 'Edit album';
$this->headTitle($title);
?>
<h1><?php echo $this->escape($title); ?></h1>
<?php
$form = $this->form;
$form->setAttribute('action',
$this->url('album', array('action' => 'edit', 'id'=>$this->id)));
echo $this->form()->openTag($form);
?>
<dl class="zend_form">
<?php echo $this->formInput($form->get('id')); ?>
<dt><?php echo $this->formLabel($form->get('title')); ?></dt>
<dd><?php
echo $this->formInput($form->get('title'));
echo $this->formElementErrors($form->get('title'));
?></dd>
<dt><?php echo $this->formLabel($form->get('artist')); ?></dt>
<dd><?php
echo $this->formInput($form->get('artist'));
echo $this->formElementErrors($form->get('artist'));
?></dd>
<dd><?php
echo $this->formInput($form->get('submit'));
echo $this->formElementErrors($form->get('submit'));
?></dd>
</dl>
<?php echo $this->form()->closeTag($form); ?>

Les seuls changements sont le titre, qui passe Edit Album et l'action du formulaire qui dfinit aussi l'action
edit .
Vous pouvez dsormais diter les albums.

Supprimer un album
Pour finaliser notre application, nous devons ajouter la fonctionnalit de suppression. Nous avons plac un lien de
suppression pour chaque album dans notre liste. La premire approche serait de faire une suppression lors d'un clic.
- 23 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Mais ce n'est pas une bonne solution. Rappelez-vous les spcifications HTTP, nous vous rappelons que vous ne
devez pas effectuer d'action irrversible en passant par GET, la place il est prfrable d'utiliser POST.
Nous allons afficher un formulaire de demande de confirmation quand l'utilisateur clique sur le lien de suppression
et lancer la suppression s'il la valide. Comme ce formulaire est assez trivial, nous le mettons directement dans notre
vue (aprs tout, Zend\Form est facultatif !).
Commenons le code de l'action dans AlbumController::deleteAction() :
module/Album/src/Album/AlbumController.php
/**/
public function deleteAction()
{
$id = (int)$this->getEvent()->getRouteMatch()->getParam('id');
if (!$id) {
return $this->redirect()->toRoute('album');
}
$request = $this->getRequest();
if ($request->isPost()) {
$del = $request->post()->get('del', 'No');
if ($del == 'Yes') {
$id = (int)$request->post()->get('id');
$this->getAlbumTable()->deleteAlbum($id);
}
// Redirect to list of albums
return $this->redirect()->toRoute('default', array(
'controller' => 'album',
'action' => 'index',
));
}

return array(
'id' => $id,
'album' => $this->getAlbumTable()->getAlbum($id)
);

/**/

Comme auparavant, nous connaissons l'id indiqu dans la route. Nous vrifions la valeur de la mthode isPost()
pour dterminer s'il faut afficher la page de confirmation ou supprimer l'album. Nous utilisons l'objet de la table
( AlbumTable ) pour supprimer la ligne, avec la mthode deleteAlbum(). Si la requte n'est pas en POST, nous
chargeons cette ligne depuis la base de donnes pour l'assigner la vue, et ce grce l'id.
Le script de la vue est un simple formulaire :
module/Album/view/album/album/delete.phtml
<?php
$title = 'Delete album';
$this->headTitle($title);
?>
<h1><?php echo $this->escape($title); ?></h1>
<p>Are you sure that you want to delete
'<?php echo $this->escape($album['title']); ?>' by
'<?php echo $this->escape($album['artist']); ?>'?
</p>
<?php
$url = $this->url('album', array('action' => 'delete', 'id'=>$this->id)); ?>
<form action="<?php echo $url; ?>" method="post">
- 24 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

module/Album/view/album/album/delete.phtml

<div>
<input type="hidden" name="id" value="<?php echo (int)$album['id']; ?>" />
<input type="submit" name="del" value="Yes" />
<input type="submit" name="del" value="No" />
</div>
</form>

Dans ce script, nous affichons le message de confirmation, puis un formulaire avec les boutons Oui ou Non. Dans
l'action, nous lanons la suppression si le Oui a t choisi.

Faire en sorte que la page d'accueil affiche la liste des albums


Un dernier point : pour l'instant, la page d'accueil http://zf2-tutorial.localhost/ n'affiche pas la liste des albums. C'est
cause de la configuration de la route, dfinie dans le fichier module.config.php du module Application. Pour changer
cela, ouvrez le fichier module/Application/config/module.config.php et trouvez la route home :
module/Application/config/module.config.php et trouvez la route home :
'home' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/',
'defaults' => array(
'controller' => 'index',
'action' => 'index',
),
),
),

Changez la valeur de la cl controller de index album :


'home' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/',
'defaults' => array(
'controller' => 'album/album',
'action' => 'index',
),
),
),

C'est termin, nous avons enfin une application fonctionnelle !

Conclusion et remerciements
Ceci conclut cette rapide prsentation de la construction, basique mais fonctionnelle, d'une application MVC base
sur Zend Framework 2. J'espre que cela vous aura t utile. Si vous dtectez une erreur, merci de me prvenir
par e-mail rob@akrabat.com !
Zend Framework 2 est toujours en version bta, il n'existe pas encore beaucoup d'articles. Vous pouvez consulter
le manuel cette adresse .
Mon site web http://akrabat.com prsente un grand nombre d'articles sur Zend Framework et je commence en
crer de nouveaux sur Zend Framework 2.

- 25 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Dmarrer avec Zend Framework 2 par Rob Allen (auteur) - Philippe Peso (traducteur)

Cet article a t publi avec l'aimable autorisation de Rob Allen. L'article original peut tre lu sur son site : http://
akrabat.com/zend-framework-2-tutorial/.
Nous remercions particulirement http://www.developpez.net/forums/u489587/philippe-peso/ pour avoir propos
de publier sa traduction de cet article.
Nous tenons aussi remercier ClaudeLELOUP pour sa relecture attentive de cet article.

- 26 Les sources prsentes sur cette page sont libres de droits et vous pouvez les utiliser votre convenance. Par contre, la page de prsentation constitue une uvre intellectuelle protge par
les droits d'auteur. Copyright Rob Allen (auteur), Philippe Peso (traduction franaise). Aucune reproduction, mme partielle, ne peut tre faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu' trois ans de prison et jusqu' 300 000 de dommages et intrts. Cette page
est dpose la SACD.

http://zend-framework.developpez.com/tutoriels/zend-framework/demarrer-avec-zend-framework-2/

Vous aimerez peut-être aussi