<?php
/**
* ÐлаÑÑ Request.
*
* @package energine
* @subpackage core
* @author 1m.dm
* @copyright ColoCall 2006
* @version $Id: Request.class.php,v 1.6 2008/04/01 14:06:09 pavka Exp $
*/
//require_once('core/framework/URI.class.php');
/**
* HTTP-запÑоÑ.
*
* @package energine
* @subpackage core
* @final
*/
final class Request extends Object {
/**
* @access private
* @var Request единÑй в ÑиÑÑеме ÑкземплÑÑ ÐºÐ»Ð°ÑÑа Request (паÑÑеÑн Singleton)
*/
private static $instance;
/**
* @access private
* @var URI ÑекÑÑий URI запÑоÑа
*/
private $uri;
/**
* @access private
* @var string пÑÑÑ Ðº коÑÐ½Ñ ÑайÑа в обÑем пÑÑи URI
*/
private $rootPath;
/**
* @access private
* @var string ÑзÑк, ÑказаннÑй в URI
*/
private $lang;
/**
* @access private
* @var array пÑÑÑ Ð¸Ð· URI запÑоÑа (без пÑÑи к коÑÐ½Ñ Ð¸ ÑзÑка)
*/
private $path;
/**
* @access private
* @var int ÑмеÑение в пÑÑи, ÑазделÑÑÑее пÑÑÑ Ñаблона, и пÑÑÑ, оÑноÑÑÑийÑÑ Ðº дейÑÑвиÑ
*/
private $offset;
/*
* Ð¢Ð¸Ð¿Ñ Ð¿ÑÑи:
*/
/**
* ÐолнÑй пÑÑÑ
*/
const PATH_WHOLE = 1;
/**
* ÐÑÑÑ Ñаблона
*/
const PATH_TEMPLATE = 2;
/**
* ÐÑÑÑ, оÑноÑÑÑийÑÑ Ðº дейÑÑвиÑ
*/
const PATH_ACTION = 3;
/**
* ÐонÑÑÑÑкÑÐ¾Ñ ÐºÐ»Ð°ÑÑа.
*
* @access private
* @return void
*/
public function __construct() {
parent::__construct();
$uri = (isset($_SERVER['HTTPS']) ? 'https' : 'http').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$this->uri = new URI($uri);
$path = $this->uri->getPath();
$rootPath = $this->getConfigValue('site.root');
if ($rootPath[strlen($rootPath)-1] != '/') {
$rootPath .= '/';
}
$rootPathLen = strlen($rootPath);
$this->rootPath = '';
if (strpos($path, $rootPath) === 0) {
$this->rootPath = substr($path, 0, $rootPathLen);
}
$path = array_values(array_diff(explode('/', substr($path, $rootPathLen)), array('')));
$language = Language::getInstance();
$this->lang = (isset($path[0]) && $language->isValidLangAbbr($path[0])) ? array_shift($path) : '';
$this->path = $path;
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÐµÐ´Ð¸Ð½Ñй Ð´Ð»Ñ Ð²Ñей ÑиÑÑÐµÐ¼Ñ ÑкземплÑÑ ÐºÐ»Ð°ÑÑа Request.
*
* @access public
* @return Request
* @static
*/
public static function getInstance() {
if (!isset(self::$instance)) {
self::$instance = new Request;
}
return self::$instance;
}
/**
* ÐозвÑаÑÐ°ÐµÑ URI запÑоÑа.
*
* @access public
* @return URI
*/
public function getURI() {
return $this->uri;
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð¿ÑÑÑ Ðº коÑÐ½Ñ ÑайÑа.
*
* @access public
* @return string
*/
public function getRootPath() {
return $this->rootPath;
}
/**
* ÐозвÑаÑÐ°ÐµÑ URI-адÑÐµÑ ÐºÐ¾ÑÐ½Ñ ÑайÑа.
*
* @access public
* @return string
*/
public function getBasePath() {
return $this->getURI()->getScheme().'://'.$this->getURI()->getHost().$this->getRootPath();
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÑзÑк, ÑказаннÑй в URI запÑоÑа.
*
* @access public
* @return string
*/
public function getLang() {
return $this->lang;
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÑегменÑ(аббÑевиаÑÑÑÑ) ÑзÑка
*
* @access public
* @return string
*/
public function getLangSegment() {
return (empty($this->lang) ? '' : $this->lang.'/');
}
/**
* ÐозвÑаÑÐ°ÐµÑ Ð¿ÑÑÑ Ð¸Ð· URI запÑоÑа.
*
* @access public
* @param int $what Ñип пÑÑи - опÑеделÑÐµÑ ÐºÐ°ÐºÑÑ ÑаÑÑÑ Ð¿ÑÑи веÑнÑÑÑ
* @param boolean $asString веÑнÑÑÑ Ð¿ÑÑÑ Ð² виде ÑÑÑоки
* @return array
*/
public function getPath($what = self::PATH_WHOLE, $asString = false) {
$path = array();
switch ($what) {
case self::PATH_WHOLE:
$path = $this->path;
break;
case self::PATH_TEMPLATE:
$path = array_slice($this->path, 0, $this->offset);
break;
case self::PATH_ACTION:
$path = array_slice($this->path, $this->offset);
break;
}
if ($asString) {
$path = (empty($path) ? '' : implode('/', $path).'/');
}
return $path;
}
/**
* УÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÑмеÑение в пÑÑи, ÑазделÑÑÑее пÑÑÑ Ñаблона, и пÑÑÑ, оÑноÑÑÑийÑÑ Ðº дейÑÑвиÑ.
*
* @access public
* @param int $offset
* @return void
*/
public function setPathOffset($offset) {
$this->offset = $offset;
}
/**
* ÐозвÑаÑÐ°ÐµÑ ÑмеÑение в пÑÑи.
*
* @access public
* @return int
*/
public function getPathOffset() {
return $this->offset;
}
/**
* ÐозвÑаÑÐ°ÐµÑ IP-адÑÐµÑ ÐºÐ»Ð¸ÐµÐ½Ñа.
*
* @access public
* @return string
*/
public function getClientIP() {
$ip = $_SERVER['REMOTE_ADDR'];
if (isset($_ENV['HTTP_X_FORWARDED_FOR']) && ip2long($_ENV['HTTP_X_FORWARDED_FOR']) != -1) {
$ip = $_ENV['HTTP_X_FORWARDED_FOR'];
}
return $ip;
}
}