Всем привет! На этом занятии мы подготовим рабочее пространство для нашего движка.
Сразу предупрежу, что кодить мы будем в кодировке UTF-8, поэтому обзаведитесь редактором, поддерживающим данную кодировку (я использую NetBeans).
Первым делом добавьте на локальном сервере новый сайт и создайте структуру каталогов:
- app
|- config
|- classes
|- controllers
|- models
|- views - modules
- core
|- classes
php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0
php_flag register_globals 0
AddDefaultCharset UTF-8
php_value default_charset UTF-8
php_value mbstring.func_overload 7
php_value mbstring.internal_encoding UTF-8
php_value mbstring.detect_order UTF-8
RewriteEngine on
RewriteRule ^(.+)$ index.php?route=$1 [QSA]
Теперь все пользовательские запросы будет обрабатывать файл index.php.
Но как-же нам выдавать пользователю картинки, css и javascript? Да очень просто, в папки, где будет лежать содержимое, которое пользователь может просматривать, добавляем другой .htaccess файл с содержанием:
RewriteEngine off
Теперь напишем функцию автоподгрузки наших классов (__autoload). Создайте файл core/functions.php со следующим содержанием:
<?php if (!defined('APP')) die('Access is forbidden!!!');
function __autoload($classname) {
$class = explode('_', strtolower($classname));
$folder = 'classes';
if (count($class) > 1) switch($class[1]) {
case 'controller':
$folder = 'controllers';
break;
case 'model':
$folder = 'models';
break;
}
if ($class[count($class) - 1] != 'core' && is_file(APP . $folder . DS . $class[0] . EXT)) { //Проверяем на наличие файла в папке приложения
define(strtoupper($class[0]) . '_CLASS');
require(APP . $folder . DS . $class[0] . EXT);
return true;
}
if (is_file(CORE . $folder . DS . $class[0] . EXT)) { //Проверяем на наличие в папке ядра
require(CORE . $folder . DS . $class[0] . EXT);
return true;
}
return false;
}
Ну а теперь наш index.php:
<?php
define('DS', DIRECTORY_SEPARATOR); //Только для сокращения
define('EXT', '.php'); //Расширение php файлов
define('APP', realpath(dirname(__FILE__)) . DS . 'app' . DS); //Корневая директория приложения
define('CORE', realpath(dirname(__FILE__)) . DS . 'core' . DS); //Корневая директория системных классов
define('MODS', realpath(dirname(__FILE__)) . DS . 'modules' . DS); //Корневая директория модулей
require(CORE . 'functions' . EXT); //Импортируем функции ядра (__autoload)
Starter::Run(); //Запускаем приложение...
На этом наш подготовительный этап закончен и вашим заданием до следующей лекции будет "Разбор полетов и как это работает?". В общем поэкспериментируйте с уже написанным кодом и попробуйте написать класс Starter, так, чтобы он подгружал модули и запускал Router (и его тоже напишите, пусть просто выводит $_GET['route']).