Router

Package engine
Inheritance class Router » LsObject
Since 1.0
Source Code /engine/classes/Router.class.php
Класс роутинга(контроллера) Инициализирует ядро, определяет какой экшен запустить согласно URL'у и запускает его.

Protected Properties

Hide inherited properties

PropertyTypeDescriptionDefined By
aConfigRoute array Конфигурация роутинга, получается из конфига Router
aParams array Список параметров ЧПУ url Router
bShowStats bool Покаывать или нет статистику выполнения Router
oAction Action|null Объект текущего экшена Router
oEngine Engine|null Объект ядра Router
oInstance Router|null Объект роутинга Router
sAction string|null Текущий экшен Router
sActionClass string|null Класс текущего экшена Router
sActionEvent string|null Текущий евент Router
sActionEventName string|null Имя текущего евента Router
sPathWebCurrent string|null Текущий полный ЧПУ url Router

Public Methods

Hide inherited methods

MethodDescriptionDefined By
Action() Функция переадресации на другой экшен Router
Exec() Запускает весь процесс :) Router
ExecAction() Запускает на выполнение экшен Router
GetAction() Возвращает текущий экшен Router
GetActionClass() Возвращает класс текущего экшена Router
GetActionEvent() Возвращает текущий евент Router
GetActionEventName() Возвращает имя текущего евента Router
GetIsAjaxRequest() Проверяет запрос послан как ajax или нет Router
GetIsShowStats() Возвращает статус показывать или нет статистику Router
GetParam() Возвращает параметр по номеру, если его нет то возвращается null Router
GetParams() Возвращает параметры(те которые передаются в URL) Router
GetPath() Возвращает правильную адресацию по переданому названию страницы(экшену) Router
GetPathWebCurrent() Возвращает текущий ЧПУ url Router
Location() Выполняет редирект, предварительно завершая работу Engine Router
Rewrite() Try to find rewrite rule for given page. Router
SetActionEvent() Устанавливает новый текущий евент Router
SetIsShowStats() Показывать или нет статистику выполение скрипта Router
SetParam() Устанавливает значение параметра Router
Shutdown() Завершение работы роутинга Router
Standart() Стандартизирует определение внутренних ресурсов. Router
__call() Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля Router
getInstance() Делает возможным только один экземпляр этого класса Router

Protected Methods

Hide inherited methods

MethodDescriptionDefined By
AssignVars() Загружает в шаблонизатор Smarty необходимые переменные Router
DefineActionClass() Определяет какой класс соответствует текущему экшену Router
GetRequestArray() Возвращает массив реквеста Router
GetRequestUri() Метод выполняет первичную обработку $_SERVER['REQUEST_URI'] Router
LoadConfig() Выполняет загрузку конфигов роутинга Router
ParseUrl() Парсим URL Router
RewriteRequest() Применяет к реквесту правила реврайта из конфига Config::Get('router.uri') Router
__clone() Блокируем копирование/клонирование объекта роутинга Router
__construct() Загрузка конфига роутинга при создании объекта Router

Property Details

aConfigRoute property
protected array $aConfigRoute;

Конфигурация роутинга, получается из конфига

aParams property
protected static array $aParams;

Список параметров ЧПУ url

/action/event/param0/param1/../paramN/

bShowStats property
protected static bool $bShowStats;

Покаывать или нет статистику выполнения

oAction property
protected Action|null $oAction;

Объект текущего экшена

oEngine property
protected Engine|null $oEngine;

Объект ядра

oInstance property
protected static Router|null $oInstance;

Объект роутинга

See Also

sAction property
protected static string|null $sAction;

Текущий экшен

sActionClass property
protected static string|null $sActionClass;

Класс текущего экшена

sActionEvent property
protected static string|null $sActionEvent;

Текущий евент

sActionEventName property
protected static string|null $sActionEventName;

Имя текущего евента

sPathWebCurrent property
protected static string|null $sPathWebCurrent;

Текущий полный ЧПУ url

Method Details

Action() method
public static 'next' Action(string $sAction, string $sEvent=NULL, array $aParams=NULL)
$sAction string Экшен
$sEvent string Евент
$aParams array Список параметров
{return} 'next'
Source Code: /engine/classes/Router.class.php#320 (show)
static public function Action($sAction,$sEvent=null,$aParams=null) {
    
self::$sAction=self::getInstance()->Rewrite($sAction);
    
self::$sActionEvent=$sEvent;
    if (
is_array($aParams)) {
        
self::$aParams=$aParams;
    }
    return 
'next';
}

Функция переадресации на другой экшен Если ею завершить евент в экшене то запуститься новый экшен Пример:

return Router::Action('error');

AssignVars() method
protected void AssignVars()
Source Code: /engine/classes/Router.class.php#223 (show)
protected function AssignVars() {
    
$this->Viewer_Assign('sAction',$this->Standart(self::$sAction));
    
$this->Viewer_Assign('sEvent',self::$sActionEvent);
    
$this->Viewer_Assign('aParams',self::$aParams);
    
$this->Viewer_Assign('PATH_WEB_CURRENT',self::$sPathWebCurrent);
}

Загружает в шаблонизатор Smarty необходимые переменные

DefineActionClass() method
protected string DefineActionClass()
{return} string
Source Code: /engine/classes/Router.class.php#297 (show)
protected function DefineActionClass() {
    if (isset(
$this->aConfigRoute['page'][self::$sAction])) {

    } elseif (
self::$sAction===null) {
        
self::$sAction=$this->aConfigRoute['config']['action_default'];
    } else {
        
//Если не находим нужного класса то отправляем на страницу ошибки            
        
self::$sAction=$this->aConfigRoute['config']['action_not_found'];
        
self::$sActionEvent='404';
    }
    
self::$sActionClass=$this->aConfigRoute['page'][self::$sAction];
    return 
self::$sActionClass;
}

Определяет какой класс соответствует текущему экшену

Exec() method
public void Exec()
Source Code: /engine/classes/Router.class.php#121 (show)
public function Exec() {
    
$this->ParseUrl();
    
$this->DefineActionClass(); // Для возможности ДО инициализации модулей определить какой action/event запрошен
    
$this->oEngine=Engine::getInstance();
    
$this->oEngine->Init();
    
$this->ExecAction();
    
$this->Shutdown(false);
}

Запускает весь процесс :)

ExecAction() method
public void ExecAction()
Source Code: /engine/classes/Router.class.php#234 (show)
public function ExecAction() {
    
$this->DefineActionClass();
    
/**
     * Сначала запускаем инициализирующий евент
     */
    
$this->Hook_Run('init_action');

    
$sActionClass=$this->DefineActionClass();
    
/**
     * Определяем наличие делегата экшена
     */
    
if($aChain=$this->Plugin_GetDelegationChain('action',$sActionClass)) {
        if(!empty(
$aChain)) {
            
$sActionClass=$aChain[0];
        }
    }
    
self::$sActionClass $sActionClass;
    
/**
     * Если класс экешна начинается с Plugin*_, значит необходимо загрузить объект из указанного плагина
     */
    
if(!preg_match('/^Plugin([\w]+)_Action([\w]+)$/i',$sActionClass,$aMatches)) {
        require_once(
Config::Get('path.root.server').'/classes/actions/'.$sActionClass.'.class.php');
    } else {
        require_once(
Config::Get('path.root.server').'/plugins/'.strtolower($aMatches[1]).'/classes/actions/Action'.ucfirst($aMatches[2]).'.class.php');
    }

    
$sClassName=$sActionClass;
    
$this->oAction=new $sClassName($this->oEngine,self::$sAction);
    
/**
     * Инициализируем экшен
     */
    
$this->Hook_Run("action_init_".strtolower($sActionClass)."_before");
    
$sInitResult $this->oAction->Init();
    
$this->Hook_Run("action_init_".strtolower($sActionClass)."_after");

    if (
$sInitResult==='next') {
        
$this->ExecAction();
    } else {
        
/**
         * Замеряем время работы action`а
         */
        
$oProfiler=ProfilerSimple::getInstance();
        
$iTimeId=$oProfiler->Start('ExecAction',self::$sAction);

        
$res=$this->oAction->ExecEvent();
        
self::$sActionEventName=$this->oAction->GetCurrentEventName();

        
$this->Hook_Run("action_shutdown_".strtolower($sActionClass)."_before");
        
$this->oAction->EventShutdown();
        
$this->Hook_Run("action_shutdown_".strtolower($sActionClass)."_after");

        
$oProfiler->Stop($iTimeId);

        if (
$res==='next') {
            
$this->ExecAction();
        }
    }
}

Запускает на выполнение экшен Может запускаться рекурсивно если в одном экшене стоит переадресация на другой

GetAction() method
public static string GetAction()
{return} string
Source Code: /engine/classes/Router.class.php#341 (show)
static public function GetAction() {
    return 
self::getInstance()->Standart(self::$sAction);
}

Возвращает текущий экшен

GetActionClass() method
public static string GetActionClass()
{return} string
Source Code: /engine/classes/Router.class.php#365 (show)
static public function GetActionClass() {
    return 
self::$sActionClass;
}

Возвращает класс текущего экшена

GetActionEvent() method
public static string GetActionEvent()
{return} string
Source Code: /engine/classes/Router.class.php#349 (show)
static public function GetActionEvent() {
    return 
self::$sActionEvent;
}

Возвращает текущий евент

GetActionEventName() method
public static string GetActionEventName()
{return} string
Source Code: /engine/classes/Router.class.php#357 (show)
static public function GetActionEventName() {
    return 
self::$sActionEventName;
}

Возвращает имя текущего евента

GetIsAjaxRequest() method
public static bool GetIsAjaxRequest()
{return} bool
Source Code: /engine/classes/Router.class.php#427 (show)
static public function GetIsAjaxRequest() {
    return 
isAjaxRequest();
}

Проверяет запрос послан как ajax или нет

GetIsShowStats() method
public static bool GetIsShowStats()
{return} bool
Source Code: /engine/classes/Router.class.php#419 (show)
static public function GetIsShowStats() {
    return 
self::$bShowStats;
}

Возвращает статус показывать или нет статистику

GetParam() method
public static string GetParam(int $iOffset, mixed|null $def=NULL)
$iOffset int
$def mixed|null
{return} string
Source Code: /engine/classes/Router.class.php#392 (show)
static public function GetParam($iOffset,$def=null) {
    
$iOffset=(int)$iOffset;
    return isset(
self::$aParams[$iOffset]) ? self::$aParams[$iOffset] : $def;
}

Возвращает параметр по номеру, если его нет то возвращается null Нумерация параметров начинается нуля

GetParams() method
public static array GetParams()
{return} array
Source Code: /engine/classes/Router.class.php#381 (show)
static public function GetParams() {
    return 
self::$aParams;
}

Возвращает параметры(те которые передаются в URL)

GetPath() method
public static string GetPath(string $action)
$action string Экшен
{return} string
Source Code: /engine/classes/Router.class.php#454 (show)
static public function GetPath($action) {
    
// Если пользователь запросил action по умолчанию
    
$sPage = ($action == 'default')
        ? 
self::getInstance()->aConfigRoute['config']['action_default']
        : 
$action;

    
// Смотрим, есть ли правило rewrite
    
$sPage self::getInstance()->Rewrite($sPage);
    return 
rtrim(Config::Get('path.root.web'),'/')."/$sPage/";
}

Возвращает правильную адресацию по переданому названию страницы(экшену)

GetPathWebCurrent() method
public static string GetPathWebCurrent()
{return} string
Source Code: /engine/classes/Router.class.php#333 (show)
static public function GetPathWebCurrent() {
    return 
self::$sPathWebCurrent;
}

Возвращает текущий ЧПУ url

GetRequestArray() method
protected array GetRequestArray(string $sReq)
$sReq string Строка реквеста
{return} array
Source Code: /engine/classes/Router.class.php#180 (show)
protected function GetRequestArray($sReq) {
    
$aRequestUrl = ($sReq=='') ? array() : explode('/',$sReq);
    for (
$i=0;$i<Config::Get('path.offset_request_url');$i++) {
        
array_shift($aRequestUrl);
    }
    
$aRequestUrl array_map('urldecode',$aRequestUrl);
    return 
$aRequestUrl;
}

Возвращает массив реквеста

GetRequestUri() method
protected string GetRequestUri()
{return} string
Source Code: /engine/classes/Router.class.php#164 (show)
protected function GetRequestUri() {
    
$sReq=preg_replace("/\/+/",'/',$_SERVER['REQUEST_URI']);
    
$sReq=preg_replace("/^\/(.*)\/?$/U",'\\1',$sReq);
    
$sReq=preg_replace("/^(.*)\?.*$/U",'\\1',$sReq);
    
/**
     * Формируем $sPathWebCurrent ДО применения реврайтов
     */
    
self::$sPathWebCurrent=Config::Get('path.root.web')."/".join('/',$this->GetRequestArray($sReq));
    return 
$sReq;
}

Метод выполняет первичную обработку $_SERVER['REQUEST_URI']

LoadConfig() method
protected void LoadConfig()
Source Code: /engine/classes/Router.class.php#208 (show)
protected function LoadConfig() {
    
//Конфиг роутинга, содержит соответствия URL и классов экшенов
    
$this->aConfigRoute Config::Get('router');
    
// Переписываем конфиг согласно правилу rewrite
    
foreach ((array)$this->aConfigRoute['rewrite'] as $sPage=>$sRewrite) {
        if(isset(
$this->aConfigRoute['page'][$sPage])) {
            
$this->aConfigRoute['page'][$sRewrite] = $this->aConfigRoute['page'][$sPage];
            unset(
$this->aConfigRoute['page'][$sPage]);
        }
    }
}

Выполняет загрузку конфигов роутинга

Location() method
public static void Location(string $sLocation)
$sLocation string URL для редиректа
Source Code: /engine/classes/Router.class.php#497 (show)
static public function Location($sLocation) {
    
self::getInstance()->oEngine->Shutdown();
    
func_header_location($sLocation);
}

Выполняет редирект, предварительно завершая работу Engine

ParseUrl() method
protected void ParseUrl()
Source Code: /engine/classes/Router.class.php#150 (show)
protected function ParseUrl() {
    
$sReq $this->GetRequestUri();
    
$aRequestUrl=$this->GetRequestArray($sReq);
    
$aRequestUrl=$this->RewriteRequest($aRequestUrl);

    
self::$sAction=array_shift($aRequestUrl);
    
self::$sActionEvent=array_shift($aRequestUrl);
    
self::$aParams=$aRequestUrl;
}

Парсим URL Пример: http://site.ru/action/event/param1/param2/ на выходе получим: self::$sAction='action'; self::$sActionEvent='event'; self::$aParams=array('param1','param2');

Rewrite() method
public string Rewrite(string $sPage)
$sPage string
{return} string
Source Code: /engine/classes/Router.class.php#471 (show)
public function Rewrite($sPage) {
    return (isset(
$this->aConfigRoute['rewrite'][$sPage]))
        ? 
$this->aConfigRoute['rewrite'][$sPage]
        : 
$sPage;
}

Try to find rewrite rule for given page. On success return rigth page, else return given param.

RewriteRequest() method
protected array RewriteRequest($aRequestUrl $aRequestUrl)
$aRequestUrl $aRequestUrl Массив реквеста
{return} array
Source Code: /engine/classes/Router.class.php#194 (show)
protected function RewriteRequest($aRequestUrl) {
    
/**
     * Правила Rewrite для REQUEST_URI
     */
    
$sReq=implode('/',$aRequestUrl);
    if(
$aRewrite=Config::Get('router.uri')) {
        
$sReq preg_replace(array_keys($aRewrite), array_values($aRewrite), $sReq);
    }
    return (
$sReq=='') ? array() : explode('/',$sReq);
}

Применяет к реквесту правила реврайта из конфига Config::Get('router.uri')

SetActionEvent() method
public static void SetActionEvent(string $sEvent)
$sEvent string Евент
Source Code: /engine/classes/Router.class.php#373 (show)
static public function SetActionEvent($sEvent) {
    
self::$sActionEvent=$sEvent;
}

Устанавливает новый текущий евент

SetIsShowStats() method
public static void SetIsShowStats(bool $bState)
$bState bool
Source Code: /engine/classes/Router.class.php#411 (show)
static public function SetIsShowStats($bState) {
    
self::$bShowStats=$bState;
}

Показывать или нет статистику выполение скрипта Иногда бывает необходимо отключить показ, например, при выводе RSS ленты

SetParam() method
public static void SetParam(int $iOffset, mixed $value)
$iOffset int Номер параметра, по идеи может быть не только числом
$value mixed
Source Code: /engine/classes/Router.class.php#402 (show)
static public function SetParam($iOffset,$value) {
    
self::$aParams[$iOffset]=$value;
}

Устанавливает значение параметра

Shutdown() method
public void Shutdown(bool $bExit=true)
$bExit bool Принудительно завершить выполнение скрипта
Source Code: /engine/classes/Router.class.php#134 (show)
public function Shutdown($bExit=true) {
    
$this->AssignVars();
    
$this->oEngine->Shutdown();
    
$this->Viewer_Display($this->oAction->GetTemplate());
    if (
$bExit) {
        exit();
    }
}

Завершение работы роутинга

Standart() method
public string Standart(string $sPage)
$sPage string
{return} string
Source Code: /engine/classes/Router.class.php#486 (show)
public function Standart($sPage) {
    
$aRewrite=array_flip($this->aConfigRoute['rewrite']);
    return (isset(
$aRewrite[$sPage]))
        ? 
$aRewrite[$sPage]
        : 
$sPage;
}

Стандартизирует определение внутренних ресурсов.

Пытается по переданому экшену найти rewrite rule и вернуть стандартное название ресусрса.

See Also

__call() method
public mixed __call(string $sName, array $aArgs)
$sName string Имя метода
$aArgs array Аргументы
{return} mixed
Source Code: /engine/classes/Router.class.php#438 (show)
public function __call($sName,$aArgs) {
    return 
$this->oEngine->_CallModule($sName,$aArgs);
}

Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля

__clone() method
protected void __clone()
Source Code: /engine/classes/Router.class.php#445 (show)
protected function __clone() {

}

Блокируем копирование/клонирование объекта роутинга

__construct() method
protected void __construct()
Source Code: /engine/classes/Router.class.php#114 (show)
protected function __construct() {
    
$this->LoadConfig();
}

Загрузка конфига роутинга при создании объекта

getInstance() method
public static Router getInstance()
{return} Router
Source Code: /engine/classes/Router.class.php#103 (show)
static public function getInstance() {
    if (isset(
self::$oInstance) and (self::$oInstance instanceof self)) {
        return 
self::$oInstance;
    } else {
        
self::$oInstance= new self();
        return 
self::$oInstance;
    }
}

Делает возможным только один экземпляр этого класса