Router
Package | engine |
---|---|
Inheritance | class Router » LsObject |
Since | 1.0 |
Source Code | /engine/classes/Router.class.php |
Protected Properties
Property | Type | Description | Defined 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
Method | Description | Defined 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
Method | Description | Defined 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
Конфигурация роутинга, получается из конфига
Список параметров ЧПУ url
/action/event/param0/param1/../paramN/
Покаывать или нет статистику выполнения
Объект текущего экшена
Объект ядра
Объект роутинга
See Also
Текущий экшен
Класс текущего экшена
Текущий евент
Имя текущего евента
Текущий полный ЧПУ url
Method Details
public static 'next' Action(string $sAction, string $sEvent=NULL, array $aParams=NULL)
| ||
$sAction | string | Экшен |
$sEvent | string | Евент |
$aParams | array | Список параметров |
{return} | 'next' |
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');
protected void AssignVars()
|
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 необходимые переменные
protected string DefineActionClass()
| ||
{return} | string |
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;
}
Определяет какой класс соответствует текущему экшену
public void Exec()
|
public function Exec() {
$this->ParseUrl();
$this->DefineActionClass(); // Для возможности ДО инициализации модулей определить какой action/event запрошен
$this->oEngine=Engine::getInstance();
$this->oEngine->Init();
$this->ExecAction();
$this->Shutdown(false);
}
Запускает весь процесс :)
public void ExecAction()
|
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();
}
}
}
Запускает на выполнение экшен Может запускаться рекурсивно если в одном экшене стоит переадресация на другой
public static string GetAction()
| ||
{return} | string |
static public function GetAction() {
return self::getInstance()->Standart(self::$sAction);
}
Возвращает текущий экшен
public static string GetActionClass()
| ||
{return} | string |
static public function GetActionClass() {
return self::$sActionClass;
}
Возвращает класс текущего экшена
public static string GetActionEvent()
| ||
{return} | string |
static public function GetActionEvent() {
return self::$sActionEvent;
}
Возвращает текущий евент
public static string GetActionEventName()
| ||
{return} | string |
static public function GetActionEventName() {
return self::$sActionEventName;
}
Возвращает имя текущего евента
public static bool GetIsAjaxRequest()
| ||
{return} | bool |
static public function GetIsAjaxRequest() {
return isAjaxRequest();
}
Проверяет запрос послан как ajax или нет
public static bool GetIsShowStats()
| ||
{return} | bool |
static public function GetIsShowStats() {
return self::$bShowStats;
}
Возвращает статус показывать или нет статистику
public static string GetParam(int $iOffset, mixed|null $def=NULL)
| ||
$iOffset | int | |
$def | mixed|null | |
{return} | string |
static public function GetParam($iOffset,$def=null) {
$iOffset=(int)$iOffset;
return isset(self::$aParams[$iOffset]) ? self::$aParams[$iOffset] : $def;
}
Возвращает параметр по номеру, если его нет то возвращается null Нумерация параметров начинается нуля
public static array GetParams()
| ||
{return} | array |
static public function GetParams() {
return self::$aParams;
}
Возвращает параметры(те которые передаются в URL)
public static string GetPath(string $action)
| ||
$action | string | Экшен |
{return} | string |
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/";
}
Возвращает правильную адресацию по переданому названию страницы(экшену)
public static string GetPathWebCurrent()
| ||
{return} | string |
static public function GetPathWebCurrent() {
return self::$sPathWebCurrent;
}
Возвращает текущий ЧПУ url
protected array GetRequestArray(string $sReq)
| ||
$sReq | string | Строка реквеста |
{return} | array |
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;
}
Возвращает массив реквеста
protected string GetRequestUri()
| ||
{return} | string |
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']
protected void LoadConfig()
|
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]);
}
}
}
Выполняет загрузку конфигов роутинга
public static void Location(string $sLocation)
| ||
$sLocation | string | URL для редиректа |
static public function Location($sLocation) {
self::getInstance()->oEngine->Shutdown();
func_header_location($sLocation);
}
Выполняет редирект, предварительно завершая работу Engine
protected void ParseUrl()
|
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');
public string Rewrite(string $sPage)
| ||
$sPage | string | |
{return} | string |
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.
protected array RewriteRequest($aRequestUrl $aRequestUrl)
| ||
$aRequestUrl | $aRequestUrl | Массив реквеста |
{return} | array |
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')
public static void SetActionEvent(string $sEvent)
| ||
$sEvent | string | Евент |
static public function SetActionEvent($sEvent) {
self::$sActionEvent=$sEvent;
}
Устанавливает новый текущий евент
public static void SetIsShowStats(bool $bState)
| ||
$bState | bool |
static public function SetIsShowStats($bState) {
self::$bShowStats=$bState;
}
Показывать или нет статистику выполение скрипта Иногда бывает необходимо отключить показ, например, при выводе RSS ленты
public static void SetParam(int $iOffset, mixed $value)
| ||
$iOffset | int | Номер параметра, по идеи может быть не только числом |
$value | mixed |
static public function SetParam($iOffset,$value) {
self::$aParams[$iOffset]=$value;
}
Устанавливает значение параметра
public void Shutdown(bool $bExit=true)
| ||
$bExit | bool | Принудительно завершить выполнение скрипта |
public function Shutdown($bExit=true) {
$this->AssignVars();
$this->oEngine->Shutdown();
$this->Viewer_Display($this->oAction->GetTemplate());
if ($bExit) {
exit();
}
}
Завершение работы роутинга
public string Standart(string $sPage)
| ||
$sPage | string | |
{return} | string |
public function Standart($sPage) {
$aRewrite=array_flip($this->aConfigRoute['rewrite']);
return (isset($aRewrite[$sPage]))
? $aRewrite[$sPage]
: $sPage;
}
Стандартизирует определение внутренних ресурсов.
Пытается по переданому экшену найти rewrite rule и
вернуть стандартное название ресусрса.
See Also
public mixed __call(string $sName, array $aArgs)
| ||
$sName | string | Имя метода |
$aArgs | array | Аргументы |
{return} | mixed |
public function __call($sName,$aArgs) {
return $this->oEngine->_CallModule($sName,$aArgs);
}
Ставим хук на вызов неизвестного метода и считаем что хотели вызвать метод какого либо модуля
See Also
protected void __clone()
|
protected function __clone() {
}
Блокируем копирование/клонирование объекта роутинга
protected void __construct()
|
protected function __construct() {
$this->LoadConfig();
}
Загрузка конфига роутинга при создании объекта
public static Router getInstance()
| ||
{return} | Router |
static public function getInstance() {
if (isset(self::$oInstance) and (self::$oInstance instanceof self)) {
return self::$oInstance;
} else {
self::$oInstance= new self();
return self::$oInstance;
}
}
Делает возможным только один экземпляр этого класса