Ядро модульного PHP движка
Опубликовано 7 января, 2010 в PHPУ меня есть ядро, к которому я прикрепляю различные модули и получается готовый движок. Данный пост – некое продолжение этого поста про ЧПУ.
Ядро до боли просто и очень удобно для программиста и дружелюбно для пользователя (использует ЧПУ). Вот суть.
В корне сайта создаем 2 файла (.htaccess и index.php) и 1 папку (modules).
В папке modules создаем 3 файла: index.php, blog.php, 404.php, просто вписываем в эти файлы строки «главная страница», «модуль блога», «ничего не найдено». Эти файлы и есть модули.
Кому лень все это создавать, можете скачать: www.zip.
Файл .htaccess:
DirectoryIndex index.php
RewriteEngine On
Options +FollowSymlinks
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+) /index.php?do=$1 [L]
После того, как этот файл появится на сервере, часть url после домена будет передана к index.php в переменной $_GET['do']. Например, если пользователь запросил site/blog/3, строка «/blog/3″ будет передана файлу index.php (некий контроллер ядра), ядро поймет, что пользователь запрашивает модуль blog (блог), запись номер 3. Соответственно, задачей index.php будет подключить модуль посредством инклуда файла blog.php из папки modules.
Теперь разберем index.php:
<?php
$do = explode('/', $_GET['do']); //Разбиваем адресную строку на состовляющие, теперь $do[0] - запрашиваемый модуль, $do[1] - то, что за слешем после модуля, например, номер записи
$mode = preg_replace ('/[^a-zA-Z0-9\s]/', '', $do[0]); //Очищаем название модуля от лишних символов, сохраняем чистое название в переменной $mode
$url = $do[1]; //В переменной $url будет храниться второй параметр урл (для некоторых модулей (тот же блог) может понаобиться.
//А вот теперь вся соль
if($mode == '') include('modules/index.php'); //Если никакой модуль не запрашивается, подключаем модуль modules/index.php (главная страница)
elseif(file_exists("modules/$mode.php")) include_once("modules/$mode.php"); //Если модуль запрошен и он присутствует в папке modules, подключаем его
else include('modules/404.php'); //Если модуля нет, выдаем 404 ошибку
?>
Готово!
А теперь вводите в браузер
http://site/
http://site/blog
http://site/hzchto
Как видите, на http://site/ подключится главная страница (modules/index.php), на http://site/blog подключился модуль блога, а на http://site/hzchto подключился модуль 404 ошибки. Но если вы создадите в папке modules файл hzchto.php, он будет подключен также, как и blog.php по соответствующему запросу.
Получилось достаточно удобное и дружелюбное модульное ядро. Я его сократил до непозволительно малых размеров, оставил лишь суть (не без небольших косяков), как доработать его до совершенства – личное дело каждого.
Еще я из модулей подключаю файлы шаблонов, которые лежат в папке templates, как это сделать, думаю, вы сами догадаетесь.
Комментариев: 4. Обязательно оставьте свой!
А можно обойтись и без $do. Т.е. просто передавать всезапросы на index.php, а там уже парсить $_SERVER['REQUEST_URI']
если в тупую перенести пример, то он не работает
Все работает. Возможно, вы не в корень скопировали, а в папку. Чтобы в отдельной папке работало, htaccess должен быть таким:
DirectoryIndex index.php
RewriteEngine On
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+) index.php?do=$1 [L]
У меня так же модульно сделана, но без htacess – чисто на php. Очень удобно получилось, всё в одном файле.