Комментарии

Маршрутизация URL
( 0 Голосов )
В данной статье мы рассмотрим часть кода файла index.php в котором находится фрагмент кода, приведенный в листинге ниже.
 
Метод route () маршрутизации приложения
 
// Маршрутизация приложения
$app->route();
 
// Пометить состояние после маршрутизации приложения в профилировщике JDEBUG
JDEBUG ? $_PROFILER->mark('afterRoute') : null;
В терминологии Joomla маршрутизатором называется класс, преобразующий URL в массив команд. В классе маршрутизатора имеются два открытых метода: parse () и build (). Метод parse () принимает объект типа JURI в качестве входного параметра и возвращает массив команд. А метод build () выполняет обратный процесс, принимая массив команд в качестве своего параметра и возвращая объект типа JURI, преобразованный из данного массива. Рассмотрим особенности этого преобразования более подробно. Напомним, что в переменной $арр хранится объект типа JSite. В листинге ниже показано, что же происходит в методе route () класса JSite из файла includes/application.арр.
 
Метод route () из класса JSite
 
public function route ()
{
parent::route();
$itemid = JRequest::getint( 'Itemid' );
$this -> authorise ( $Itemid );
}
Напомним, что класс JSite служит расширением класса JApplication из файла libraries/joomla/application/application.php. В классе JApplication также имеется метод route (). Поэтому метод route () переопределяет в классе JSite одноименный метод из класса JApplication. Прежде всего он вызывает метод route () из родительского класса (JApplication) по команде parent: : route (). Исходный код метода route () из родительского класса JApplication приведен в листинге ниже.
 
public function route()
{
// получить полный запрос URI $uri = clone JURI::getlnstance();
$router = $this->getRouter();
$result = $router->parse($uri);
JRequest::set($result, 'get', false);
 
// инициировать событие onAfterRoute JPluginHelper::importPlugin('system');
$this->triggerEvent('onAfterRoute');
}
В коде этого метода получается текущий объект типа JURI. Команда clone предписывает системе сделать копию объекта типа JURI вместо того, чтобы использовать исходный объект. Это делается для того, чтобы мы неумышленно не видоизменили текущий URI (Универсальный идентификатор ресурса) при обращении с объектом типа JURI. Сделав копию этого объекта, мы можем далее работать именно с ней, например, видоизменить ее, не меняя оригинал.
 
В итоге мы получаем URL для последующего синтаксического анализа. В следующей строке кода получается конкретный объект класса маршрутизатора. В данном случае мы находимся в пользовательской части веб-сайта, иначе называемой сайтом, и поэтому при выполнении команды $this->getRouter () получаем объект типа JRouterSite (одноименного класса из файла includes/router.php).
 
Далее выполняется метод parse () маршрутизатора, возвращающий ассоциативный массив команд. В рассматриваемом здесь примере объект типа JURI будет содержать сведения об URL для пункта меню выбора статьи (http://мойсайт.ru/index.рhр/название_статьи), а в массив команд он превращается следующим образом:
 
  • Itemid — 123 (идентификатор пункта меню)
  • option — com_content (наименование компонента)
  • view — статья (наименование представления)
  • id — 234 (идентификатор статьи)
 
Вся эта информация сохраняется обратно в переменной $_GET языка РНР с помощью метода JRequest:: set (). И наконец, инициируется системное событие onAfterRoute для выполнения любых системных подключаемых модулей при наступлении этого события.
 
На этом выполнение метода route () из родительского класса завершается и происходит возврат к методу route () из класса JSite. В итоге мы получаем Itemid — столбец идентификаторов из базы данных для пункта меню, который нам требуется отобразить.
 
Вызывая далее метод $this->authorise (), мы проверяем, уполномочен ли текущий пользователь просматривать этот пункт меню. И наконец, мы возвращаем файл index.php и выполняем команду DEBUG.
 

Понравился материал? Пригодилась информация? Плюсани в социалки!


 
Похожие новости