Самые важные настройки файла .htaccess
#Установка кодировки
AddDefaultCharset utf-8
# Редиректы с www на без www
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteCond %{REQUEST_URI} !robots.txt
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
#Редиректы на корень сайта
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !robots.txt
RewriteRule ^.+$ /$1 [QSA,L]
В index.php первым делом устанавливаем константу абсолютного пути и подключаем файл аутолоадера
// константа абсолютного пути
define('ROOT', dirname(__FILE__));
require_once ROOT."/components/Autoload.php";
// Вызов Router
$router = new \components\Router();
$router->run();
ob_end_flush();
Файл роутера:
namespace components;
/**
* Класс Router
* Компонент для работы с маршрутами
*/
class Router
{
/**
* Свойство для хранения массива роутов
* @var array
*/
private $routes;
/**
* Конструктор
*/
public function __construct()
{
// Путь к файлу с роутами
$routesPath = ROOT . '/config/routes.php';
// Получаем роуты из файла
$this->routes = include($routesPath);
}
/**
* Возвращает строку запроса
*/
private function getURI(){
if(!empty($_SERVER['REQUEST_URI'])){
//return $_SERVER['REQUEST_URI'];
return trim($this->escapeStr($_SERVER['REQUEST_URI'], 77), '/');
}
}
function escapeStr($str, $size = 0)
{
$str = trim($str);
$str = preg_replace('/[`\'"\(\)\<\>\]\[\}\{\\\\]/', '', $str);
$str = htmlentities($str, ENT_QUOTES, "UTF-8");
if($size) $str = mb_substr($str, 0, $size, "UTF-8");
return $str;
}
/**
* Метод для обработки запроса
*/
public function run()
{
// Получаем строку запроса
$uri = $this->getURI();
// Проверяем наличие такого запроса в массиве маршрутов (routes.php)
foreach($this->routes as $uriPattern => $path)
{
// Сравниваем $uriPattern и $uri
if(preg_match("~$uriPattern~", $uri))
{
// Получаем внутренний путь из внешнего согласно правилу
$internalRoute = preg_replace("~$uriPattern~", $path, $uri);
// Определить контроллер, action, параметры
$segments = explode('/', $internalRoute);
$controllerName= array_shift($segments) . 'Controller';
$controllerName= ucfirst($controllerName);
$actionName = 'action' . ucfirst(array_shift($segments));
$parameters = $segments;
// Подключить файл класса - контроллера
$controllerFile = ROOT . '/controllers/' .
$controllerName . '.php';
if(file_exists($controllerFile))
{
include_once($controllerFile);
}
$controllerName = "\\controllers\\$controllerName";
// Создать объект, вызвать метод (т.е. action)
$controllerObject = new $controllerName;
/* Вызываем необходимый метод ($actionName) у определенного
* класса ($controllerObject) с заданными ($parameters) параметрами
*/
$result = call_user_func_array(array($controllerObject,$actionName), $parameters);
// Если метод контроллера успешно вызван, завершаем работу роутера
if ($result != null) {
break;
}
}
}
}
}
Когда определена функция и сам контроллер который будет обрабатывать строку запроса, в самом конроллере создаётся экземпляр класса Model, в котором содержатся все основные функции соединения с БД, выборки используя подготовленные запросы PDO и другие методы. Контроллер выбирает нужные данные из БД и передаёт их в файл вида (view). Все файлы видов, css, js, картинки - всё лежит в папке template. При MVC используются только абсолютные пути к файлам.
Скачать с гитхаб