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

Un MVC en PHP5 : le flux d’entrée

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ésente la classe wRequest. C’est la représentation du flux d’entrée.

Elle contient les informations suivantes :

  • la REQUEST_METHOD (méthode de la requête)
    Les possibilités sont GET, POST, PUT, HEAD ou DELETE.
  • object : l’objet sur lequel on agit.
  • action : l’action appelée.
  • un tableau des paramètres.
  • referer_object et referer_action désignent l’objet et l’action qui ont invoqués cette nouvelle requête.

 

La méthode route() permet de parser la requête afin d’en extraire les informations ci-dessus.

La méthode requireCredentials() détermine si le couple object/action nécessite des permissions spéciales grâce au fichier de configuration XML de l’application.

On peut bien sûr étoffer cette classe en parsant toutes les variables $SERVER pour obtenir d’autres informations sur la requête en question.

 

Voilà la classe :

<?php

/**
* wRequest
*
* @author William DURAND <william.durand1@gmail.com>
*/

class wRequest
{
  const METHOD_GET = 'GET';
  const METHOD_PUT = 'PUT';
  const METHOD_POST = 'POST';
  const METHOD_HEAD = 'HEAD';
  const METHOD_DELETE = 'DELETE';

  /**
  * @var string
  */

  private $_method;
  /**
  * @var string
  */

  private $_object;
  /**
  * @var string
  */

  private $_action;
  /**
  * @var array
  */

  private $_parameters;
  /**
  * @var string
  */

  private $_referer_object;
  /**
  * @var string
  */

  private $_referer_action;

  /**
  * Constructor
  */

  public function __construct()
  {
    switch($_SERVER['REQUEST_METHOD'])
    {
      case self::METHOD_GET:    $this->_method = self::METHOD_GET;
                    break;
      case self::METHOD_PUT:    $this->_method = self::METHOD_PUT;
                    break;
      case self::METHOD_POST:   $this->_method = self::METHOD_POST;
                    break;
      case self::METHOD_HEAD:   $this->_method = self::METHOD_HEAD;
                    break;
      case self::METHOD_DELETE:   $this->_method = self::METHOD_DELETE;
                    break;

      default:  if(__DEBUG__)
            {
              $GLOBALS['logger']->info($requestUri, '[wRequest] Unknown request method');
            }
         
            throw new Exception('[wRequest] Unknown request method');
    }

    $this->_parameters = array();
  }

  /**
  * route()
  */

  public function route()
  {
    $requestUri = substr($_SERVER['REQUEST_URI'],
      strpos($_SERVER['REQUEST_URI'], __DIR_SEPARATOR__ . __APP_CONTROLLER__) +
      strlen(__DIR_SEPARATOR__ . __APP_CONTROLLER__)
    );

    if(__DEBUG__)
    {
      $GLOBALS['logger']->info($_SERVER['REQUEST_URI'], '[wRequest] Request URI');
      $GLOBALS['logger']->info($requestUri, '[wRequest] Got request URI');
    }

    if(empty($requestUri))
    {
      return array();
    }

    $path = parse_url($requestUri, PHP_URL_PATH);
    preg_match('#^(/(?P<object>\w+))(/(?P<action>\w+)/?)?$#', $path, $matches);

    foreach(explode('&', parse_url($requestUri, PHP_URL_QUERY)) as $id => $arg)
    {
      $arg = split('=', $arg);
      if(count($arg) == 2)
        $this->_parameters[$arg[0]] = $arg[1];
    }

    foreach($_GET as $k => $value)
      $this->_parameters[$k] = $value;

    foreach($_POST as $k => $value)
      $this->_parameters[$k] = $value;

    $this->_object = $matches['object'];
    $this->_action = $matches['action'];

    $referer_matches = array('object' => '', 'action' => '');

    if(isset($_SERVER['HTTP_REFERER']))
    {
      $requestUri = substr($_SERVER['HTTP_REFERER'],
        strpos($_SERVER['HTTP_REFERER'], __DIR_SEPARATOR__ . __APP_CONTROLLER__) + strlen(__DIR_SEPARATOR__ . __APP_CONTROLLER__)
      );

      $path = parse_url($requestUri, PHP_URL_PATH);
      preg_match('#^(/(?P<object>\w+))(/(?P<action>\w+)/?)?$#', $path, $referer_matches);
    }

    $this->_referer_object = $referer_matches['object'];
    $this->_referer_action = $referer_matches['action'];

    return $matches;
  }

  /**
  * isPost()
  * @return boolean
  */

  public function isPost()
  {
    return $this->_method == self::METHOD_POST;
  }

  /**
  * isPut()
  * @return boolean
  */

  public function isPut()
  {
    return $this->_method == self::METHOD_PUT;
  }

  /**
  * isGet()
  * @return boolean
  */

  public function isGet()
  {
    return $this->_method == self::METHOD_GET;
  }

  /**
  * isHead()
  * @return boolean
  */

  public function isHead()
  {
    return $this->_method == self::METHOD_HEAD;
  }

  /**
  * isDelete()
  * @return boolean
  */

  public function isDelete()
  {
    return $this->_method == self::METHOD_DELETE;
  }

  /**
  * getParameter()
  * @param $key
  * @return string
  */

  public function getParameter($key)
  {
    return $this->_parameters[$key];
  }

  /**
  * setParameter()
  * @param $key
  * @param $value
  */

  public function setParameter($key, $value)
  {
    $this->_parameters[$key] = $value;
  }

  /**
  * hasParameter()
  * @param $key
  * @return boolean
  */

  public function hasParameter($key)
  {
    return isset($this->_parameters[$key]) ? true : false;
  }

  /**
  * getAction()
  * @return string
  */

  public function getAction()
  {
    return $this->_action;
  }

  /**
  * getObject()
  * @return string
  */

  public function getObject()
  {
    return $this->_object;
  }

  /**
  * getRefererObject()
  * @return string
  */

  public function getRefererObject()
  {
    return $this->_referer_object;
  }

  /**
  * getRefererAction()
  * @return string
  */

  public function getRefererAction()
  {
    return $this->_referer_action;
  }

  /**
  * Magic Method Getter
  */

  public function __get($attribute)
  {}

  /**
  * Magic Method Setter
  */

  public function __set($attribute, $value)
  {}

  /**
  * requireCredentials()
  * @return boolean
  */

  public function requireCredentials()
  {
    $c = wConfig::getValueOf('credentials/' . $this->getObject() . '/' . $this->getAction());

    if(!is_null($c))
    {
      if(__DEBUG__)
        $GLOBALS['logger']->info($c, '[wRequest] ' . $this->getObject() . '/' . $this->getAction() . ' needs credentials');

      return true;
    }

    if(__DEBUG__)
      $GLOBALS['logger']->info('[wRequest] ' . $this->getObject() . '/' . $this->getAction() . ' doesn\'t need credentials');

    return false;
  }
}

?></action></object></action></object>
  • 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.