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

Source for file Request.class.php

Documentation is available at Request.class.php

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