Pattern, Service Locator ou Registry en PHP
Le modÚle de conception Service Locator / Registry mis en situation dans un MVC
Introduction
Le Service Locator, est un pattern permettant la sauvegarde et la restitution d’objets, pour cela, il utilise un tableau par lequel il garde en memoire les objets. Dans une application utilisant le motif MVC, l’utilisation de registre apparait comme une bonne methode sachant que l’application est centrée sur un seul fichier, “index.php”.
Avant d’expliquer comment le mettre en oeuvre, on va d’abord le mettre en situation dans un cas concret.
Notre application est concue sur un modele MVC et tourne autour du fichier index.php.
Aborescence de notre application :
- /app/controllers
- /app/models
- /app/views
- /index.php
index.php
-
<?php
-
// charge le MVC
-
require_once ("app/MVC.php");
-
// pattern Service Locator
-
require_once ("app/ServiceLocator.php");
-
-
try {
-
// Initialise le FC
-
$fc = new FrontController ("/app/controllers/");
-
-
// Initialisation du modele i18n
-
require_once ("/app/models/I18n.php");
-
$i18n = new I18n ("fr_FR", "i18n/");
-
-
// Sauvegarde du modele en registre
-
ServiceLocator::register ("i18n", $i18n); //!\
-
-
// Demarre l’appli
-
$fc->dispatch (new HttpRequest (), new View ("/app/views/"));
-
} catch (Exception $e) {
-
echo $e->getMessage ();
-
die ();
-
}
-
?>
On peut s’apercevoir que dans le fichier index.php on crée l’instance de notre modele I18n. Ensuite par l’intermediaire de ServiceLocator, on le place en registre.
Le controlleur : IndexAction.php
-
<?php
-
class IndexAction extends Controller
-
{
-
public function doAction (HttpRequest $request, View $view) {
-
try
-
{
-
// Recupere l’objet i18n enregistre en registre (:
-
$i18n = ServiceLocator::registry ("i18n"); //!\
-
-
$i18n->setLangue ("en_US");
-
$view->bonjour = $i18n->__(‘bonjour_le_monde’);
-
echo $view->render ("default.tpl.php");
-
-
} catch (Exception $e) {
-
echo $e->getMessage ();
-
die ();
-
}
-
}
-
}
-
?>
Maintenant on récupere notre objet afin de l’utiliser dans notre controlleur IndexAction.php. On remarque que notre application dispose d’une seule occurence I18n pouvant etre utilisée dans tout les controlleurs.
La classe Service Locator
Rien de compliqué dans cette classe, on se sert simplement de methodes et attributs statiques, le tout est de bien faire attention à eviter les doublons, et retourner les bons messages d’erreur en cas d’une mauvaise utilisation de celui-ci.
-
<?php
-
class ServiceLocator
-
{
-
static private $_registry = array ();
-
-
/**
-
* Enregistre un objet dans le registre
-
*
-
* @param string $key
-
* @param objet $obj
-
*/
-
static public function register ($key, $obj)
-
{
-
// Verifie les doublons de clefs
-
if (array_key_exists ($key, self::$_registry)) {
-
throw new Exception ("La clef {$key} est deja enregisté.");
-
}
-
-
// Verifie s’il s’agit bien d’un objet
-
if (!is_object ($obj)) {
-
throw new Exception ("Vous pouvez enregister seulement des objets.");
-
}
-
-
// pas de probleme, on enregistre
-
self::$_registry[$key] = $obj;
-
}
-
-
/**
-
* Restaure un objet enregistré
-
*
-
* @param string $key
-
* @return objet
-
*/
-
static public function registry ($key)
-
{
-
if (!array_key_exists ($key, self::$_registry)) {
-
throw new Exception ("Aucun objet enregistré sous ce nom");
-
}
-
-
return self::$_registry[$key];
-
}
-
}
-
?>
L’utilisation de ce pattern est interessant car il permet d’eviter tout code superflu, et optimise un maximun l’application, dans le sens où on l’utilise à la maniere d’un Singleton une seule instance de nos modeles, et cette instance est disponible partout dans notre application.
Tableau de bord
Share and Enjoy















