Регистрация    Вход    Форум    Поиск    FAQ

  •  Новости
  • Beeline + Twitter = чирикай через SMS!

    Beeline + Twitter = чирикай через SMS! На первой картинке обозначены команды, при помощи которых через SMS Вы сможете кого-либо зафолловить или же отписаться, ретвитнуть чей-либо пост или же написать личное сообщение.

    Open Graph Protocol. От создателей Facebook

    Open Graph Protocol. От создателей Facebook Разбираясь с Facebook API, случайно наткнулся на другую интересную разработку от этих людей.

    Глобальное ускорение Wordpress

    Глобальное ускорение Wordpress Не считая очевидных решений типа отключения некоторых плагинов и перехода на тему попроще, я вижу 2 пути для оптимизации: кэширование и сжатие траффика.




  •  Часы


  •  Поиск

Optimaze » Программирование » Маршрутизация на сайте средствами PHP




Маршрутизация на сайте средствами PHP

  1. Определились «зачем?», перейдем к «как?».


Давайте поговорим о интересных полезностях, которые рано или поздно пригодятся любому web-developer`у.

 

Начнем с Роутинга ( eng. “Routing” – маршрутизация ). Сразу же появляется вопрос, зачем же нужна на сайте маршрутизация, если и раньше все хорошо работало и устраивало? Все просто. Если вы хотите получить более гибкую систему и уменьшить время на настройку/перенастройку сайта, то маршрутизация вам необходима. К тому же централизованное управление сайтом упростит работу с кодом.

Когда то я сам пользовался обычной switch-case маршрутизацией и думал, что это удобно (на самом деле даже такая маршрутизация куда лучше, чем ее отсутствие).

Все это было на старом функциональном php даже без какого-либо намека на ООП. Такого рода система получалась очень не гибкой, т.к. появлялись трудности в передаче данных в модули, код был очень громоздким, так как приходилось держать логику вместе с маршрутизацией, а потом меня осенило – почему бы не сделать следующее:

  • 1) маршрутизацию без кода поместить в отдельный файл (это позволит свободно редактировать файл прямо через админку)
  • 2) поместить логику отдельно в класс, который бы занимался генерацией контента для страниц

 

В этой статье многие не найдут какой-либо новизны,но я не стремлюсь вводить инновацию, я просто хочу открыть глаза тем, кто еще спит и пользуется менее удобными способами :)

 

Определились «зачем?», перейдем к «как?».

Первый шаг, который нам нужно сделать, для создания удобной и практичной маршрутизации – записать следующий код в . htaccess:

 

  • RewriteEngine On
  • RewriteCond %{REQUEST_FILENAME} !-f
  • RewriteCond %{REQUEST_FILENAME} !-d
  • RewriteRule . * index. php [L]

Этот код перенаправит обработку всех страниц на index. php, что даст нам возможность упростить управление контентом. Для увеличения понимания советую обратить внимание на статью DarkKemper`a

 

Теперь, когда у нас есть перенаправление, перейдем к созданию файла-маршрутизатора. Я пользуюсь xml-форматом, но это не особо важно, главное, что бы вам было удобно.

 

  • <router><!--Корень-->
  •  <header><!--Настройки статической области страницы-->
  •   <modules><!--Модули, подключаемые в эту область-->
  •    <module>packageName1. ClassName/MethodName</module>
  •    <!--имя_пакета. ИмяКласса/имя_метода-->
  •    <module>packageName2. ClassName/MethodName</module>
  •    <module>packageName3. ClassName/MethodName</module>
  •   </modules>
  •  </header>
  •  <page>

  <uri>/</uri><!--Ссылка на страницу, которую мы собираемся настроить-->

  <modules>

   ...

  </modules>

 </page>

</router>

 

Все довольно просто: в файле-маршрутизаторе вы можете указывать настройки как для отдельных URL, так и для каких-либо статичных частей страниц. В примере я указал модули для шапки сайта, так как она у меня не меняется. Замечу, что кроме модулей, вы можете указывать настройки, какие-либо передаваемые параметры, правила… В общем все, что угодно.

 

Последний и самый важный шаг – пишем класс Router, который и будет заведовать всей маршрутизацией.

 

Для начала нам нужно разобрать xml-файл:

  • private static function parse( $configPath )   {
  •   return simplexml_load_file( $configPath );
  • }

Метод parse() получает путь к вашему конфигу ( можно использовать не только для маршрутизации ) и возвращает SimpleXML object.

Теперь вы можете обращаться к каким либо настройкам следующим образом: $xml->header->modules …

 

  • public static function GetContent( $configPath ) {
  •   $content = '';
  •   $router = self::parse( $configPath );
  •   foreach( $router as $page ) {
  •     if( preg_match(
  •       '#^' . $page->uri . '$#'
  •      , str_replace( $_SERVER['QUERY_STRING'], '', $_SERVER['REQUEST_URI'] )
  •      , $uriParts
  •       )
  •     )   {
  •       if( ! empty( $page->modules->module ) ) {
  •         foreach( $page->modules->module as $modul ) {
  •            $pageModules = $modul;
  •            //Modul::Load() занимается загрузкой пакетов из <module>... </module>
  •            $content . = Modul::Load( $modul, $uriParts[1]?: $uriParts[1] );
  •         }
  •      }
  •     }
  •   }
  •   //в своем конфиге я создал группу "page404", которая обрабатывается, если для данной страницы не заданы модули
  •   if( empty( $pageModules ) )    {
  •     foreach( $router->page404->modules->module as $modul )  {
  •       $pageModules[] = $modul;
  •       $content . = Modul::Load( $modul );
  •      }
  •     }
  •     return $content;
  • }

Итак, для начала мы парсим xml-файл, после чего обрабатываем регулярным выражением строку из <uri>… </uri>.

Если мы находим соответствие с URL текущей страницы, то подключаем модули, указанные в файле-маршрутизаторе. Если не находим – то подключаются модули 404 страницы.

 

Ну, вот и все. Ничего сложного тут нет.

Выводы можно сделать следующие:

  • + Система очень простая,
  • + Легко и быстро можно изменить страницы и разделы до неузнаваемости,
  • + Благодаря регулярным выражениям можно легко связать модули (мы можем передавать в них параметры).
  • - Если ваш файл-маршрутизатор большой, то без кэширования лучше не работать.


Рейтинг: 4.8/5, основан на 25 голосах.


Нравится



Вернутся назад


   

Вам будет интересно:

Введение в Ajax

Prototype предоставляет разработчику простой кросс-браузерный инструментарий для осуществления Ajax-запросов.

WordPress – CSS в постах

Так как через wp-admin дописать CSS в шапку поста невозможно, приходится извращатся.

Создание нестандартных настроек WP-темы

Объясню, в частности, как организовать загрузку файла юзера, с последующим использованием его в теме.

Почему не работает функция strtolower()

Немного посмеялся и поправил на более корректный вариант в данном случае, заодно решил и сюда отписать, вдруг читатель встретился с таким, но, к сожалению, не будет знать как это решить.



  •  Публикации


8 методов раскрутки своего форума с нуля

8 методов раскрутки своего форума с нуля Итак, у вас имеется свой собственный форум, но его никто не посещает? Мы готовы помочь вам справиться с этой нелегкой проблемой.

Как привлекать посетителей на проект

Как привлекать посетителей на проект Данная статья в основном рассчитана на тех, кто самостоятельно занимается продвижением своего проекта.

Про MySQL, серверы и PayPal

Про MySQL, серверы и PayPal Проклял все настройки кодировок, проклял DirectAdmin и еле-еле нашел то место где располагается и задается общий пароль для ...

Реклама в Твиттере. Как подать свой продукт

Реклама в Твиттере. Как подать свой продукт Твиттер уже давно стал из нового web 2. 0 сервиса рекламной площадкой с огромным количеством потенциальных пользователей ...

Пока блог на локалхосте

Пока блог на локалхосте Самое время кратко описать, чем нам придется заниматься. Прежде всего нужно понять, что блог ты будешь делать для получения ...

Авторитет блоггера притягивает

Авторитет блоггера притягивает Долго не знал с чего начать данную статью. Статья что-то типа мыслей вслух и философии.