PHP HTTPRequest Class

January 10th, 2008 by rvdavid Leave a reply »

Note: This is is a quick example of a very basic HTTP Request Class in PHP. This would be a nice, practical introduction to classes for someone who has been looking for a place to start.

Problem: By default, request data in PHP is handled by using Super Globals ($_POST, $_GET, $_COOKIES). Globals are bad for several reasons (outside the scope of this example google here). In an effort to remedy this, we need a way to encapsulate the request data into an object. By doing this, we are centralising access to request data through the one channel – the HTTP Request object.

Class Name:HTTPRequest

Responsibilities:

  • Store “request data” in GPC order.
  • Store additional “request data” outside of the super globals referenced by a key.
  • Read stored “request data” by referencing a key.
  • Internally clean request data by handling magic_quotes_gpc and then adding slashes.
  • Allow access to data stored in GET, POST and COOKIE super globals.

Collaborators: Any – the request object is used by any other class or function that requires access to the request data.


Class Code:

# Filename: httprequest.php

<?php
/**
 * HTTPRequest Class
 * @author R. Villar David <[email protected]>
 *
 * Encapsulate request data into the one object providing a
 * single channel for request data access and manipulation.
 *
 */
class HTTPRequest
{
	/**
	 * Holds collective request data
	 *
	 * @var array
	 */
	protected $_data = array();

	/**
	 * Holds data from the $_POST super global
	 *
	 * @var array
	 */
	protected $_post = array();

	/**
	 * Holds data from the $_GET super global
	 *
	 * @var array
	 */
	protected $_get = array();

	/**
	 * Holds data from the $_COOKIE super global
	 *
	 * @var array
	 */
	protected $_cookie = array();

	/**
	 * Constructor
	 * Stores "request data" in GPC order.
	 */
	public function __construct()
	{
		$this->_data = array_merge($this->_data, $_REQUEST);
		$this->_get = array_merge($this->_get, $_GET);
		$this->_post = array_merge($this->_post, $_POST);
		$this->_cookie = array_merge($this->_cookie, $_COOKIE);
		$this->_clean();
	}

	/**
	 * Store "request data" in GPC order.
	 *
	 * @param string $key
	 * @param mixed $value
	 */
	public function set($key, $value)
	{
		$this->_data[$key] = $value;
	}

	/**
	 * Read stored "request data" by referencing a key.
	 *
	 * @param string $key
	 * @return mixed
	 */
	public function get($key)
	{
		return isset($this->_data[$key]) ? $this->_data[$key] : null;
	}

	/**
	 * Allow access to data stored in GET, POST and COOKIE super globals.
	 *
	 * @param string $var
	 * @param string $key
	 * @return mixed
	 */
	public function getRawData($var, $key)
	{
		switch(strtolower($var)) {
			case 'get':
			$array = $this->_get;
			break;

			case 'post':
			$array = $this->_post;
			break;

			case 'cookie':
			$array = $this->_cookie;
			break;

			default:
			$array = array();
			break;
		}

		if(isset($array[$key])) {
			return $array[$key];
		}
		return null;
	}

	/**
	 * Internally clean request data by handling magic_quotes_gpc and then adding slashes.
	 *
	 */
	protected function _clean()
	{
		if(get_magic_quotes_gpc()) {
			$this->_data = $this->_stripSlashes($this->_data);
			$this->_post = $this->_stripSlashes($this->_post);
			$this->_get = $this->_stripSlashes($this->_get);
		}
	}

	/**
	 * Strip slashes code from php.net website.
	 *
	 * @param mixed $value
	 * @return array
	 */
	protected function _stripSlashes($value)
	{
	    if(is_array($value)) {
			return array_map(array($this,'_stripSlashes'), $value);
		} else {
			return stripslashes($value);
		}
	}
}

Example Usage

# Example Usage
require 'httprequest.php';

$request = new HTTPRequest();
$request->set('testvar','123');
$message = 'Username and Password submitted';
echo '<h1>Simulated Form: </h1>';
echo '<form action="?submit_message='.urlencode($message).'" method="post" style="width: 40em; font-size: 0.9em;">';
echo '<fieldset>';
echo '<legend style="font-weight: bold">Demo login</legend>';
echo '<label for="username" style="display: block; float: left; width: 110px;">username:</label><input type="text" id="username" name="username" value="'.$request->get('username').'" /><br />';
echo '<label for="password" style="display: block; float: left; width: 110px;">password:</label><input type="password"  id="password" name="password" value="'.$request->get('password').'" /><br />';
echo '<input value="submit" type="submit"/><br />';
echo '<input type="hidden" value="submitted" name="submitted"/>';
echo '</fieldset>';

if($request->get('submitted')) {
	echo '<div style="border: 1px solid #000; padding: 5px; margin-top: 20px;">';
	echo '<span style="font-weight: bold;">Form submitted with the following values:</span>';
	echo '<ul style="color: #f00;">';
	echo '<li>submit Message (query string):'.$request->get('submit_message').'</li>';
	echo '<li>testvar (manually set variable):'.$request->get('testvar').'</li>';
	echo '<li>username (text field):'.$request->get('username').'</li>';
	echo '<li>password (text field):'.$request->get('password').'</li>';
	echo '</ul>';
	echo '</div>';
}

echo '</form>';

Download
HTTPRequest Class

As demonstrated in the code provided in the Example Usage section, the HTTPRequest class provides a centralised solution for handling request data.

This is a just base which you could build on top, or around of if you need more complex request data handling.

All in all a very simple class. Super globals are copied and “cleaned” in the constructor, getters and a setter to give you a channel where you can store your custom request data.

One of the things I take for granted with this class is the fact that I don’t need to manaully check for existing variables (eg if(isset($_POST['var'])) {) as this operation is abstracted in the get() method. If you try to access a variable that is not there, you will simply get a null value – notices need not be suppressed anymore.

Another feature that I did not set up an example for is the getRaw() method which allows you to access a variable from a specific super global, instead of relying on the data acquired from the $_REQUEST super global. While I did have a use for this, it was a special case scenario, but I thought I’d add it in to exemplify how you could add your own methods.

As you advance, you may find that you will need to add further support – such as providing the remote IP address, reading the URI string etc.

if you enjoyed this post, make sure you subscribe to my RSS feed!
You can also follow me on Twitter here.

Related posts:

  1. Ternary Expression in PHP
  2. Create meaningful class attributes, not ambiguous arrays, in PHP
  3. Template View and View Helper Design Patterns in PHP (updated v2)
Advertisement

7 comments

  1. James says:

    Thanks for wasteing my time – I got this:

    Fatal error: Call to undefined method HttpRequest::set() in ….

  2. rvdavid says:

    Really? I don’t believe you. ;)
    I tested this class before posting (and again just then)

    Try this:
    - Click on the TXT link under the heading “download”
    - Copied the contents
    - Paste into your a php file and run it.

  3. harry says:

    i want to make a payment gateway with nab transaction how to do pls hekp me . thnks ………..

  4. change your single quotes to the correct ones

  5. rakesh says:

    nothing is happening!!! Total waste of time

    • rvdavid says:

      you need a concept of objects to make full use of it. Try including the class then instantiating the request object by writing the following code:

      $request = new HTTPRequest();

      You will then have access to the values from request variables such as $_GET, $_POST or $_COOKIE by using $request->get(‘variablename’) etc.
      The aim of this very basic class is to make it so that you won’t need to use the $_GET, $_POST, $_COOKIE globals to access request data. You’d be getting it from the one tangible source instead.

      If you don’t get it, it’s no biggie either. Objects and structured architecture isn’t for everyone as I found out quite recently. Some big companies using PHP out there do not practice OOP and seem to be doing ok. ;)

Leave a Reply

Notify me of followup comments via e-mail. You can also subscribe without commenting.