Эволюция создания ядра для сайтов

Привет. Данная статья возможно будет полезна новичкам в области веб программирования, а может кому-то еще ). Суть в том, что у каждого начинающего веб разработчика есть свой собственный путь. Свой метод получения эффективного результата и достижения простых мелочей.
Каждый наверное мечтал создать свою идальную CMS, свою суперсистему для решения той или иной задачи. Благо PHP язык не замысловатый и позволяет более менее простыми деталями влесть в дебри кода. Большинство сайтов же идентичны, с одинаковой основой. 90% всех сайтов с повторяющимся функционалом.
Достаточно один лишь раз сделать одну вещь и пользуйся ей всю жизнь, преобразуя под разные новые стандарты. Со временем меняется код, html, можно упростить некоторые детали. Появляются нове технологии, но суть остается одна.
Нужно грамотно владеть преобразованием текстов, структурой html для правильного отображения и проработки данных.
Я опишу вкратце свой путь. Возможно, чтобы не забыть как это было в старину, возможно, чтобы оценить всю историю преобразований.

У всех сайтов одна основа. И не раз уже писали о важности инклудов. include(). На всех страницах - одна шапка, один футер. Это так и должно быть. Пользователь сразу видит, что он тм же где и был, что кнопочки он уже изучил, не нужно их изучать заново. Также изменение одного лишь файла приводит к изменению на всех страницах. Как это сделать? include()
Создаете файл header.html или header.php, далее в каждом файле в начале и в конце <?php include('header.php')?> и <?php include('footer.php')?>
Погодите. Но ведь на самом деле наоборот. Это внутри основной страницы находится различный контент. Пишем основной файл, например index.php, внутри которого находится ссылка на передаваемый методом GET параметр. К примеру <?php if(file_exists($_GET['act'].'.php'))include($_GET['act'].'.php'); else echo '404'; ?>.
Теперь, чтобы обратиться к какой-либо странице - нужно лишь передать ссылки в виде index.php?act=contacts. Если файла не будет - вернется 404, но человек увидит шапку и сможет перейти на главную, в случае ошибки. А мы можем настроить оповещение, если надо на случай прихода не по правильной ссылке.
Метод чреват на различные попытки взлома. Передав в гете ?act=./... - можно попасть на уровень выше и получить доступ к какому-либо файлу. Можем исключить данную дыру либо заменой "/", либо использовав различные шаблонизаторы.
Хорошо. Подключаем шаблонизаторы. Можно это сделать на любом их этапов.
Теперь, у нас вызываемся один лишь индексный файл, нужно в него положить еще ряд действий в зависимости от параметра $_GET['act']. Мы к примеру можем создать таблицу и вызывать нужную функцию для каждого возможного значения

switch ($_GET["act"]) {
    case "index"     :  $data = index();     break;
    case "contacts"  :  $data = contacts();  break;
    default          :  $data = index();     break;
}
print $data;

Теперь мы разбили общий файл на модель MVC виювер-контроллер. В самом начале происходит определение что подано на вход, проверки всевозможные. Далее выполняются какие-либо сборы данных, расчеты и в конце - отображение через стандартный шаблонизатор.
Для каждой функции обязательно нужно передать общие параметры в виде global $Smarty,$auth; Что не очень хорошо.
Очень хорошо. А зачем лишние движения? Зачем вносить $data=... когда название функции всегда совпадает с $_GET['act']. Мы же можем вызвать функцию, дописав к переменной ().

if (function_exists($_GET["act"]))$_GET["act"]();

Анализируем. Смотрим. Хорошо. Но не всегда безопасно. Могут быть в файле также дополнительные функции, которые вызывать таким методом не хотелось бы. Ладно, создаем переменную, пазрешающую каждую функцию.
Создаем костыль в виде $possiblefuncs=array(); и перед каждой функцией $possiblefuncs['index']=1; А в конце

if (isset($possiblefuncs['index']))$_GET["act"]();
?act=что-либо - не красиво, согласитесь. Для современных сайтов передавать адрес страницы через параметр - трудно воспринимается и вносится. Прошлый век. Что мы можем сделать? У нас есть modrewrite и .htaccess
Вроде бы ничего сложного. Пишем правила

RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{QUERY_STRING} !-f
  RewriteRule ^([^/]+).php(.*)$ index.php?act=$1$2 [QSA,L]

Теперь все что-то.php будет передаваться как index.php?act=что-то
Гугл просит обращаться к файлам через тире. Хорошо? Конечно. Теперь нам надо сделать еще одну замену

if (isset($possiblefuncs['index']))str_replace('-','_',$_GET['act'])();
Мы вернули красоту. Хорошо? Да!. Но не достаточно. Если человек передаст несколько параметров?.. А русский язык? Пусть он еще не прижился окончательно, но вполне может быть использован. А .php на конце - так ли оно нужно?
Финальная революция к идеальному коду начинается с полного обновления всех источников. Переписываем .htaccess как

RewriteEngine on
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{QUERY_STRING} !-f
  RewriteRule ^([^.]+)$ index.php?link=$1 [QSA,L]

Теперь у нас полносью путь прописывается в один лишь параметр link
Разбивать можно в php. Пишем в начале

if (empty($_GET['link']))$_GET['link'] = '';
$links = explode('/', $_GET['link']);

Ну а далее перечисляем все нужное нам

switch ($links[0]){
    case '':
    ...
    break;
    default:
    ...
    break;
}

Прощайте global в каждой функции. Прощайте .php в коне файла. Мы разом убрали все недостатки, и оптимизировали быстродействие. Если нужно использовать следующие ссылки - мы можем использовать if (isset($links[1])). Русские симвлоы в названии ссылки - легко
Проекты получаются быстрыми и чистыми

  • Автор: kosmom
  • Рейтинг: 0
  • Просмотров: 496
  • Комментариев: 0
  • Создан: 01.11.2011 17:57

Комментарии (0)