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

Un MVC en PHP5 : le contexte de l’application

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

 

Dans l’optique d’écrire quelques brèves sur ce site, j’ai décidé de présenter la réalisation d’un Modèle Vue Contrôleur en PHP5. J’expliquerai fonctionnalité par fonctionnalité et pas à pas comment réaliser un MVC type en PHP5.

Dans cet article je présenterai le contexte de l’application. Le contexte, c’est ce qui est nécessaire au fonctionnement de l’application. Le contexte orchestre le MVC. Dans l’optique du design pattern IOC pour Inversion Of Control, le contexte permet au MVC de gérer l’application en lui fournissant ce dont elle a besoin.

Le contexte commence par créer et initialiser les objets nécessaires à l’application. La méthode getControleurApplication() est dédié à cette tâche.

La classe de contexte initialise les flux Request et Response, l’utilisateur et l’ORM permettant le dialogue avec la base de données.

 

La classe se présente de la sorte :

<?php

/**
* wContext : The project context.
*
* @author William DURAND <william.durand1@gmail.com>
*/

class wContext
{
  /**
  * @var string
  */

  private $app_name;
  /**
  * @var wAppControleur
  */

  private $controleur_app;
  /**
  * @var wOrm
  */

  private $_orm;
  /**
  * @var wUser
  */

  private $_user;
  /**
  * @var wRequest
  */

  private $_request;
  /**
  * @var wResponse
  */

  private $_response;
  /**
  * @var wContext
  */

  private static $_instance;

  /**
  * Constructor
  */

  private function __construct()
  {}

  /**
  * Magic function
  * Getter
  */

  private function __get($name)
  { return $this->$name; }

  /**
  * Magic function
  * Setter
  */

  private function __set($name, $value)
  { $this->$name = $value; }

  /**
  * Magic function
  * Clone
  */

  final private function __clone()
  {}

  /**
  * @return wContext
  */

  final public static function getInstance()
  {
    if(is_null(self::$_instance))
    {
      $c = __CLASS__;
      self::$_instance = new $c;
    }

    return self::$_instance;
  }

  /**
  * Setup context
  */

  private static function setup()
  {
    $c = self::getInstance();

    $c->_orm = new wOrm();
    $c->_user = new wUser();
    $c->_request = new wRequest();
    $c->_response = new wResponse();
  }

  /**
  * @return boolean
  */

  public static function isRegistered()
  {
    return !is_null(self::getControleurApp());
  }

  /**
  * @return string
  */

  public static function getAppName()
  {
    return self::getInstance()->app_name;
  }

  /**
  * @return wAppControleur
  */

  public static function getControleurApp()
  {
    return self::getInstance()->controleur_app;
  }

  /**
  * @return wOrm
  */

  public static function getOrm()
  {
    return self::getInstance()->_orm;
  }

  /**
  * @return wUser
  */

  public static function getUser()
  {
    return self::getInstance()->_user;
  }

  /**
  * @return wRequest
  */

  public static function getRequest()
  {
    return self::getInstance()->_request;
  }

  /**
  * @return wResponse
  */

  public static function getResponse()
  {
    return self::getInstance()->_response;
  }

  /**
  * @param wAppControleur $controleur_app Application Controller
  */

  private static function registerControleurApp(wAppControleur $controleur_app)
  {
    if(!self::isRegistered())
    {
      $c = self::getInstance()->controleur_app = $controleur_app;
    }
  }

  /**
  * @param $name Name of the application controller
  */

  private static function setAppName($name)
  {
    self::getInstance()->app_name = $name;
  }

  /**
  * @param $str_controleur_app Application Controller Name
  * @return wAppControleur
  */

  public static function getControleurApplication($str_controleur_app = null)
  {
    if(self::isRegistered())
      return self::getControleurApp();

    if(is_null($str_controleur_app))
      throw new Exception('No application defined !');

    $str_controleur_app = strtolower($str_controleur_app);

    self::setAppName($str_controleur_app);

    define('__BASE_DIR__', basename(dirname(realpath(__FILE__ . '/../..'))));
    include(realpath(__FILE__ . '/../../..') . '/configuration/config.inc.php');

    define('__CURRENT_APP_PATH__', __APPLICATIONS_DIR__ . __DIR_SEPARATOR__ . self::getAppName() . __DIR_SEPARATOR__);

    if(__DEBUG__)
    {
      include(realpath(__FILE__ . '/../..') . '/view/firephp/FirePHP.class.php');
      $GLOBALS['logger'] = FirePHP::getInstance(true);
      $GLOBALS['logger']->trace('[wContext] DEBUGGER ENABLED for ' . self::getAppName() . ' !');
    }

    include('core' . __DIR_SEPARATOR__ . 'autoload' . __DIR_SEPARATOR__ . 'wAutoload.class.php');
    spl_autoload_register(array('wAutoload', 'execute'));

    set_error_handler(array('wError', 'errorHandler'));

    session_start();

    self::setup();

    $controleur_app = 'my' . ucfirst($str_controleur_app) . 'Controleur';

    self::registerControleurApp(new $controleur_app(self::getInstance()));

    return self::getControleurApp();
  }
}

?>

 

Son utilisation est simple, prenons le cas d’une application frontend, la page index.php contiendra le code suivant :

<?php
  include 'core/context/wContext.class.php';
  define('__APP_CONTROLLER__', basename(__FILE__));

  $app = wContext::getControleurApplication('frontend');
  $app->dispatch();
?>

 

<

p style= »text-align: justify; »>Le contexte construit tout ce qui est nécessaire à l’application frontend puis retourne une instance de cette application. Il suffit d’invoquer le dispatcher pour exécuter le traitement du flux d’entrée.</

Le contexte construit tout ce qui est nécessaire à l’application frontend puis retourne une instance de cette application. Il suffit d’invoquer le dispatcher pour exécuter le traitement du flux d’entrée.

  • 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.