energine
[ class tree: energine ] [ index: energine ] [ all elements ]

Source for file Request.class.php

Documentation is available at Request.class.php

  1.  
  2. /**
  3.  * Класс Request.
  4.  *
  5.  * @package energine
  6.  * @subpackage core
  7.  * @author 1m.dm
  8.  * @copyright Energine 2006
  9.  * @version $Id$
  10.  */
  11.  
  12. //require_once('core/framework/URI.class.php');
  13.  
  14. /**
  15.  * HTTP-запрос.
  16.  *
  17.  * @package energine
  18.  * @subpackage core
  19.  * @author 1m.dm
  20.  * @final
  21.  */
  22. final class Request extends Object {
  23.  
  24.     /**
  25.      * @access private
  26.      * @var Request единый в системе экземпляр класса Request (паттерн Singleton)
  27.      */
  28.     private static $instance;
  29.  
  30.     /**
  31.      * @access private
  32.      * @var URI текущий URI запроса
  33.      */
  34.     private $uri;
  35.  
  36.     /**
  37.      * @access private
  38.      * @var string путь к корню сайта в общем пути URI
  39.      */
  40.     private $rootPath;
  41.  
  42.     /**
  43.      * @access private
  44.      * @var string язык, указанный в URI
  45.      */
  46.     private $lang;
  47.  
  48.     /**
  49.      * @access private
  50.      * @var array путь из URI запроса (без пути к корню и языка)
  51.      */
  52.     private $path;
  53.  
  54.     /**
  55.      * @access private
  56.      * @var int смещение в пути, разделяющее путь шаблона, и путь, относящийся к действию
  57.      */
  58.     private $offset;
  59.  
  60.     /*
  61.      * Типы пути:
  62.      */
  63.  
  64.     /**
  65.      * Полный путь
  66.      */
  67.     const PATH_WHOLE = 1;
  68.  
  69.     /**
  70.      * Путь шаблона
  71.      */
  72.     const PATH_TEMPLATE = 2;
  73.  
  74.     /**
  75.      * Путь, относящийся к действию
  76.      */
  77.     const PATH_ACTION = 3;
  78.     
  79.      private $port = 80;
  80.  
  81.     /**
  82.      * Конструктор класса.
  83.      *
  84.      * @access private
  85.      * @return void 
  86.      */
  87.     public function __construct({
  88.         parent::__construct();
  89.  
  90.         $uri (isset($_SERVER['HTTPS']'https' 'http').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
  91.         $this->uri = new URI($uri);
  92.         //Определение порта
  93.         //SERVER_PORT - не катит при использовании проброса из какого то порта на 80
  94.         $port = explode(':'$_SERVER['HTTP_HOST']);
  95.         $this->uri->setPort((sizeof($port)>1)?$port[1]:80);
  96.         
  97.         $path $this->uri->getPath();
  98.         $rootPath $this->getConfigValue('site.root');
  99.         if ($rootPath[strlen($rootPath)-1!= '/'{
  100.             $rootPath .= '/';
  101.         }
  102.         $rootPathLen = strlen($rootPath);
  103.         $this->rootPath = '';
  104.         if (strpos($path$rootPath=== 0{
  105.             $this->rootPath = substr($path0$rootPathLen);
  106.         }
  107.         $path = array_values(array_diff(explode('/'substr($path$rootPathLen))array('')));
  108.         try {
  109.             $language Language::getInstance();
  110.             $this->lang = (isset($path[0]&& $language->isValidLangAbbr($path[0])) ? array_shift($path'';
  111.         }
  112.         catch (SystemException $e){
  113.             $this->lang = '';
  114.         }
  115.         $this->path = $path;
  116.     }
  117.  
  118.     /**
  119.      * Возвращает единый для всей системы экземпляр класса Request.
  120.      *
  121.      * @access public
  122.      * @return Request 
  123.      * @static
  124.      */
  125.     public static function getInstance({
  126.         if (!isset(self::$instance)) {
  127.             self::$instance new Request;
  128.         }
  129.         return self::$instance;
  130.     }
  131.  
  132.     /**
  133.      * Возвращает URI запроса.
  134.      *
  135.      * @access public
  136.      * @return URI 
  137.      */
  138.     public function getURI({
  139.         return $this->uri;
  140.     }
  141.  
  142.     /**
  143.      * Возвращает путь к корню сайта.
  144.      *
  145.      * @access public
  146.      * @return string 
  147.      */
  148.     public function getRootPath({
  149.         return $this->rootPath;
  150.     }
  151.  
  152.     /**
  153.      * Возвращает URI-адрес корня сайта.
  154.      *
  155.      * @access public
  156.      * @return string 
  157.      */
  158.     public function getBasePath({
  159.         return $this->getURI()->getScheme().'://'.$this->getURI()->getHost().((($port $this->getURI()->getPort()) == 80)?'':':'.$port).$this->getRootPath();
  160.     }
  161.  
  162.     /**
  163.      * Возвращает язык, указанный в URI запроса.
  164.      *
  165.      * @access public
  166.      * @return string 
  167.      */
  168.     public function getLang({
  169.         return $this->lang;
  170.     }
  171.  
  172.     /**
  173.      * Возвращает сегмент(аббревиатуру) языка
  174.      *
  175.      * @access public
  176.      * @return string 
  177.      */
  178.     public function getLangSegment({
  179.         return (empty($this->lang'' $this->lang.'/');
  180.     }
  181.  
  182.     /**
  183.      * Возвращает путь из URI запроса.
  184.      *
  185.      * @access public
  186.      * @param int $what тип пути - определяет какую часть пути вернуть
  187.      * @param boolean $asString вернуть путь в виде строки
  188.      * @return array 
  189.      */
  190.     public function getPath($what self::PATH_WHOLE$asString false{
  191.         $path array();
  192.         switch ($what{
  193.             case self::PATH_WHOLE:
  194.                 $path $this->path;
  195.                 break;
  196.             case self::PATH_TEMPLATE:
  197.                 $path = array_slice($this->path0$this->offset);
  198.                 break;
  199.             case self::PATH_ACTION:
  200.                 $path = array_slice($this->path$this->offset);
  201.                 break;
  202.         }
  203.         if ($asString{
  204.             $path (empty($path'' : implode('/'$path).'/');
  205.         }
  206.         return $path;
  207.     }
  208.  
  209.     /**
  210.      * Устанавливает смещение в пути, разделяющее путь шаблона, и путь, относящийся к действию.
  211.      *
  212.      * @access public
  213.      * @param int $offset 
  214.      * @return void 
  215.      */
  216.     public function setPathOffset($offset{
  217.         $this->offset = $offset;
  218.     }
  219.  
  220.     /**
  221.      * Возвращает смещение в пути.
  222.      *
  223.      * @access public
  224.      * @return int 
  225.      */
  226.     public function getPathOffset({
  227.         return $this->offset;
  228.     }
  229.  
  230.     /**
  231.      * Возвращает IP-адрес клиента.
  232.      *
  233.      * @access public
  234.      * @return string 
  235.      */
  236.     public function getClientIP({
  237.         $ip $_SERVER['REMOTE_ADDR'];
  238.         if (isset($_ENV['HTTP_X_FORWARDED_FOR']&& ip2long($_ENV['HTTP_X_FORWARDED_FOR']!= -1{
  239.             $ip $_ENV['HTTP_X_FORWARDED_FOR'];
  240.         }
  241.         return $ip;
  242.     }
  243. }
В создании документации нам помог: phpDocumentor