Skip to content

Commit

Permalink
Introducing a $_REQUEST/POST/GET wrapper
Browse files Browse the repository at this point in the history
This new wrapper ensures types are correct and accessed parameters are
actually set (with custom default fallbacks).

The wrapper is available in the global $INPUT variable. It accesses
$_REQUEST by default. If POST or GET is required, the post and get
members can be used:

$INPUT->int('foo',false); // access $_REQUEST['foo'], default false
$INPUT->post->int('foo'); // access $_POST['foo'], default 0
$INPUT->get->int('foo'); // access $_GET['foo'], default 0

The codebase still needs to be updated to make use of this.
  • Loading branch information
splitbrain committed Jun 24, 2012
1 parent 3791b58 commit 8917730
Show file tree
Hide file tree
Showing 3 changed files with 152 additions and 0 deletions.
147 changes: 147 additions & 0 deletions inc/Input.class.php
@@ -0,0 +1,147 @@
<?php

/**
* Encapsulates access to the $_REQUEST array, making sure used parameters are initialized and
* have the correct type.
*
* All function access the $_REQUEST array by default, if you want to access $_POST or $_GET
* explicitly use the $post and $get members.
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
class Input {

/** @var PostInput Access $_POST parameters */
public $post;
/** @var GetInput Access $_GET parameters */
public $get;

protected $access;

/**
* Intilizes the Input class and it subcomponents
*/
function __construct() {
$this->access = &$_REQUEST;
$this->post = new PostInput();
$this->get = new GetInput();
}

/**
* Access a request parameter without any type conversion
*
* @param string $name Parameter name
* @param mixed $default Default to return if parameter isn't set
* @return mixed
*/
public function param($name, $default = null) {
if(!isset($this->access[$name])) return $default;
return $this->access[$name];
}

/**
* Get a reference to a request parameter
*
* This avoids copying data in memory, when the parameter is not set it will be created
* and intialized with the given $default value before a reference is returned
*
* @param string $name Parameter name
* @param mixed $default Initialize parameter with if not set
* @return &mixed
*/
public function &ref($name, $default = '') {
if(!isset($this->access[$name])) {
$this->access[$name] = $default;
}

$ref = &$this->access[$name];
return $ref;
}

/**
* Access a request parameter as int
*
* @param string $name Parameter name
* @param mixed $default Default to return if parameter isn't set or is an array
* @return int
*/
public function int($name, $default = 0) {
if(!isset($this->access[$name])) return $default;
if(is_array($this->access[$name])) return $default;

return (int) $this->access[$name];
}

/**
* Access a request parameter as string
*
* @param string $name Parameter name
* @param mixed $default Default to return if parameter isn't set or is an array
* @return string
*/
public function str($name, $default = '') {
if(!isset($this->access[$name])) return $default;
if(is_array($this->access[$name])) return $default;

return (string) $this->access[$name];
}

/**
* Access a request parameter as bool
*
* @param string $name Parameter name
* @param mixed $default Default to return if parameter isn't set
* @return bool
*/
public function bool($name, $default = '') {
if(!isset($this->access[$name])) return $default;

return (bool) $this->access[$name];
}

/**
* Access a request parameter as array
*
* @param string $name Parameter name
* @param mixed $default Default to return if parameter isn't set
* @return array
*/
public function arr($name, $default = array()) {
if(!isset($this->access[$name])) return $default;

return (array) $this->access[$name];
}

}

/**
* Internal class used for $_POST access in Input class
*/
class PostInput extends Input {
protected $access;

/**
* Initialize the $access array, remove subclass members
*/
function __construct() {
$this->access = &$_POST;
unset ($this->post);
unset ($this->get);
}
}

/**
* Internal class used for $_GET access in Input class
*/
class GetInput extends Input {
protected $access;

/**
* Initialize the $access array, remove subclass members
*/
function __construct() {
$this->access = &$_GET;
unset ($this->post);
unset ($this->get);
}
}
4 changes: 4 additions & 0 deletions inc/init.php
Expand Up @@ -197,6 +197,10 @@ function_exists('ob_gzhandler')) {
// load libraries
require_once(DOKU_INC.'inc/load.php');

// input handle class
global $INPUT;
$INPUT = new Input();

// initialize plugin controller
$plugin_controller = new $plugin_controller_class();

Expand Down
1 change: 1 addition & 0 deletions inc/load.php
Expand Up @@ -62,6 +62,7 @@ function load_autoload($name){
'Doku_Event' => DOKU_INC.'inc/events.php',
'Doku_Event_Handler' => DOKU_INC.'inc/events.php',
'EmailAddressValidator' => DOKU_INC.'inc/EmailAddressValidator.php',
'Input' => DOKU_INC.'inc/Input.class.php',
'JpegMeta' => DOKU_INC.'inc/JpegMeta.php',
'SimplePie' => DOKU_INC.'inc/SimplePie.php',
'FeedParser' => DOKU_INC.'inc/FeedParser.php',
Expand Down

0 comments on commit 8917730

Please sign in to comment.