• Ce blog — désormais archivé — est en lecture seule.

Présentation d’une classe Context dans un MVC PHP5 : wContext dans wMVC

Ce qui suit est déprécié depuis janvier 2010.
Merci de votre compréhension.

wMVC c’est le nom du petit MVC (Model View Controller) que j’ai commencé à développer. il reprend la base de ce site mais ajoute pas mal de nouveautés.

je présente ici la classe wcontext qui définit le contexte de l’application. cette classe est utile pour récupérer l’application et la manipuler, c’est aussi là qu’on initialise toute l’application (autoload, session, handlers, …).

dans wMVC, deux applications sont par défaut : le frontend et le backend.

La classe se compose comme suit :

<?php

class wcontext
{
private $appname;
private $controleur_app;
private static $instance;

public function __construct()
{}

public static function getinstance()
{
if(is_null(self::$instance))
{
self::$instance = new self();
}
return self::$instance;
}

public function getcontroleurapp()
{
return $this->controleur_app;
}

public function isregistered()
{
return !is_null($this->controleur_app);
}

public function registercontroleurapp(wappcontroleur $controleur_app)
{
if(!$this->isregistered())
$this->controleur_app = $controleur_app;
}

public function setappname($name)
{
$this->appname = $name;
}

public function getappname()
{
return $this->appname;
}

public static function getcontroleurapplication($str_controleur_app)
{
if(self::getinstance()->isregistered())
return self::getinstance()->getcontroleurapp();

self::getinstance()->setappname($str_controleur_app);

define('__base_dir__', basename(dirname(realpath(__file__ . '/../..'))));
require_once(realpath(__file__ . '/../../..') . '/configuration/config.inc.php');

define('__current_app_path__', __applications_dir__ . __dir_separator__ . wcontext::getinstance()->getappname() . __dir_separator__);

if(__debug__)
{
require_once(realpath(__file__ . '/../..') . '/view/firephp/firephp.class.php');
$globals['logger'] = firephp::getinstance(true);
$globals['logger']->trace('[wcontext] debugger enabled for ' . self::getinstance()->getappname() . ' !');
}

require_once('core' . __dir_separator__ . 'autoload' . __dir_separator__ . 'wautoload.class.php');
spl_autoload_register(array('wautoload', 'execute'));

set_error_handler(array('werror', 'errorhandler'));

session_start();

$controleur_app = call_user_func(array('my' . ucfirst($str_controleur_app) . 'controleur', 'getinstance'));

self::getinstance()->registercontroleurapp($controleur_app);

return self::getinstance()->getcontroleurapp();
}
}

?>

C’est un singleton. elle contient le nom de l’application (frontend, backend) et l’application en elle-même. la fonction principale est getcontroleurapplication(). cette fonction est statique et prend en paramètre un nom d’application.

La fonction comence par vérifier que l’application n’est pas déjà créée. si ce n’est pas le cas, elle retient le nom de l’application. on définit la constante __base_dir__ et on charge le fichier de constantes (config.inc.php). la constante __current_app__ est également définie.

Si le mode debug est activé, on crée le une instance de firephp que l’on place en global.

On charge ensuite la classe wautoload qui redéfinit la fonction magique __autoload().

spl_autoload_register(array('wautoload', 'execute'));

On définit le handler pour les erreurs : désormais c’est la classe werror qui s’en occupera.

set_error_handler(array('werror', 'errorhandler'));

On active la session puis on crée une instance du contrôleur de notre application :

$controleur_app = call_user_func(array('my' . ucfirst($str_controleur_app) . 'controleur', 'getinstance'));

Cette ligne permet d’appeler la fonction statique getinstance() sur un objet du type : myapplicationcontroleur. Pour terminer, on enregistre ce ce contrôleur et on le renvoi.

Le fichier index.php (qui est le frontal de notre projet) fait appelle au contexte :

<?php

require_once('core/context/wcontext.class.php');
define('__app_controller__', basename(__file__));

$app = wcontext::getcontroleurapplication('frontend');
$app->dispatch();

?>

La structure d’un projet wMVC est comme ceci :

projet

|__ applications

|              |__ frontend

|              |__ backend

|__ assets

|__ configuration

|__ core

|__ model

|__ ressources

|__ templates_c

|

index.php

backend.php

Si l’on ajoute une application à notre projet : projet/applications/new_app notre fichier « point d’entrée » (exemple : newapp.php) se composera simplement comme ceci :

<?php

require_once('core/context/wcontext.class.php');
define('__app_controller__', basename(__file__));

$app = wcontext::getcontroleurapplication('new_app');
$app->dispatch();

?>

Voilà un intérêt de développer un contexte dans une architecture mvc.

  • Print
  • Digg
  • StumbleUpon
  • del.icio.us
  • Facebook
  • Twitter
  • Google Bookmarks
  • FriendFeed
  • LinkedIn
  • MySpace
  • Netvibes
  • PDF
  • Ping.fm
  • RSS
  • Technorati
  • viadeo FR
  • Wikio
  • Yahoo! Buzz

Related Posts

Cet article a été publié dans Ancien blog avec les mots-clefs : , , , , , , . Bookmarker le permalien. Les commentaires et les trackbacks sont fermés.