В корневой директории сайта создадим две папки - application и lib и три файла - index.php, config.php, .htaccess . В папке lib будут находится классы. В директории application нужно создать еще три папки - models,views и controllers.
Запишем в файл .htaccess следующие строки:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
Этот файл будет перенаправлять все запросы на индексный файл.
Файл index.php содержит строки:
<?php
require_once "./config.php";
$router=new Lib_Application;
$member=$router->Run();
$member['init']=0;
foreach ($member as $key => $value) {
$$key= $value;
}
$view=$router->getView();
include ($view);
Здесь сначала мы подключаем файл - config.php, затем вызывается метод Run() класса Lib_Application этим методом происходит вызов соответствующего контроллера. Цикл foreach обходит массив переменной $member которая хранит данные контроллера и затем с помощью include ($view) передает эти данные на вывод.
И последний файл корневой директории - config.php:
<?php
function __autoload ($class_name)
{
$path=str_replace("_", "/", $class_name);
include_once($path .".php");
}
?>
Здесь находится php функция __autoload, она автоматически выполняется когда вызывается какой-нибуть класс.
Перейдем теперь к папке с классами - lib, создаем в ней три файла с именами - Application.php, BaseController.php и Forms.php,которые совпадают с именами классов. Например файл Application.php и класс в этом файле должен называтся Lib_Application.
Вставим в Application.php следующий код:
<?php
class Lib_Application
{
private function getRoute()
{
if (empty($_GET['route']))
{
$route = 'index';
}
else
{
$route = $_GET['route'];
}
return $route;
}
private function getController()
{
$route=$this->getRoute();
$path_contr = 'application/controllers/';
$controller= $path_contr. $route . '.php';
return $controller;
}
public function getView()
{
$route=$this->getRoute();
$path_view = 'application/views/' ;
$view = $path_view . $route . '.phtml';
return $view;
}
public function Run()
{
$controller=$this->getController();
$cl=explode('.', $controller);
$cl=$cl[0];
$name_contr=str_replace("/", "_", $cl);
$contr=new $name_contr;
$contr->index();
$member=$contr->member;
return $member;
}
}
?>
Класс Lib_Application содержит четыре метода, два из них getRoute() и getController() доступны только внутри этого класса.Метод getRoute() возвращает имя страницы. В данной статье - это index, page1 и page2 .
Метод getController() возвращает путь к контроллеру, например - application/controllers/Page1.php . Метод getView() возвращает путь к выводу данных, например - application/views/page1.phtml .
И последний метод Run() сначала преобразует строку application/controller/page1.php в строку application_controller_page1,другими словами из пути к контроллеру в имя класса контроллера. В последних четырех строках метода Run() сначала идет вызов соответствующего контроллера и его метода index().Все контроллеры имеют метод index().Затем метод возвращает массив данных контроллерав переменной $member .
Рассмотрим теперь класс Lib_BaseController файла BaseController.php:
<?php
class Lib_BaseController
{
private $member;
function __set($name,$val)
{
$this->member[$name] = $val;
}
function __get($name)
{
return $this->member;
}
}
?>
Этот класс является общим для всех контроллеров, к ним он подключается при помощи ключевого слова - extends, например class Application_Controllers_Index extends Lib_BaseController . Функция __set класса Lib_BaseController автоматически заносит в массив закрытой переменной $member все переменные контроллера типа $this->var . Затем с помощью метода __get передает массив $member .
Последний класс Lib_Forms написан для примера вместо стандартного Hello и напрямую к mvc не относится.
Запишем в файл Forms.php следующий класс:
<?php
class Lib_Forms
{
private $row = 2;
private $colum = 2;
private $bg="silver";
function setAtrib($row,$colum,$bg)
{
$this->row=$row;
$this->colum=$colum;
$this->bg=$bg;
}
function getTable()
{
$str="<table bgcolor=\"$this->bg\"
border=\"1\" width=\"300\">";
$a=0;
for ($i=1; $i<=$this->row; $i++)
{
$str .= "<tr>";
for ($j=1; $j<=$this->colum; $j++)
{
$str.="<td align=\"center\">"
.$a++ ."</td>";
}
$str .= "</tr>";
}
$str.="</table>";
return $str;
}
}
?>
При вызове функции getTable() создается таблица с параметрами, $row - число рядов, $colum - число столбцов в таблицы и $bg цвет таблицы. Параметры передаются вызовом метода setAtrib($row, $colum, $bg). Значения по умолчанию хранятся в закрытых переменных $row=2, $colum=2, $bg="silver" .
Контроллеры
Папка controllers в директории application содержит три однотипных файла это Index.php, Page1.php, Page2.php .
Index.php :
<?php
class Application_Controllers_Index
extends Lib_BaseController
{
function index()
{
$t=new Application_Models_Table;
$tabl= $t->test();
$this->tabl=$tabl;
}
}
?>
Page1.php :
<?php
class Application_Controllers_Page1
extends Lib_BaseController
{
function index()
{
$t=new Application_Models_Table1;
$tabl= $t->test();
$this->tabl=$tabl;
}
}
?>
Page2.php :
<?php
class Application_Controllers_Page2
extends Lib_BaseController
{
function index()
{
$t=new Application_Models_Table2;
$tabl= $t->test();
$this->tabl=$tabl;
}
}
?>
В каждом из трех контроллеров сначала идет вызов соответствующей модели, затем из нее получаем данные - $tabl= $t->test() и передается в html - $this->tabl=$tabl . Также все контроллеры,как уже описывалось выше,при помощи ключевого слова extends,наследуют все свойства и методы базового класса Lib_BaseController .
Модели
В папке models также находятся три похожих файла - Table.php, Table1.php и Table2.php .
Table.php :
<?php
class Application_Models_Table
{
function test()
{
$tabl = new Lib_Forms;
$tabl=$tabl->getTable();
return $tabl;
}
}
?>
Table1.php :
<?php
class Application_Models_Table1
{
function test()
{
$tabl = new Lib_Forms;
$tabl->setAtrib(6,4,"red");
$tabl=$tabl->getTable();
return $tabl;
}
}
?>
Table2.php :
<?php
class Application_Models_Table2
{
function test()
{
$tabl = new Lib_Forms;
$tabl->setAtrib(8,7,"green");
$tabl=$tabl->getTable();
return $tabl;
}
}
?>
Как видно все файлы почти одинаковые, в классе Application_Models_Table не вызывается метод setAtrib($row,$colum,$bg) класса Lib_Forms,поэтому устанавливаются параметры по умолчанию.В классах Application_Models_Table1 и Application_Models_Table2 вызывается метод setAtrib($row,$colum,$bg) с различными параметрами.
Вид
В папке views создаем три файла index.phtml, page1.phtml и page2.phtml в каждый из них вставим следующий код:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1251">
<body style="margin-top: 10em">
<div align="center">
<a href=".">home</a>
<a href="page1">page1</a>
<a href="page2">page2</a>
<br>
<h3> </h3>
<?php
echo $tabl;
?>
</div>
</body>
</html>
Затем внутри тэга "h3" вставляем следующие строки, для index.phtml - home, для page1.phtml - page1, для page2.phtml - page2 .