Содержание
Структура MVC шаблона проектирования
Как правило, у всех фреймворков выработана стандартная структура (может немного варьироваться):
- application.
- contrlollers,
- models,
- view.
- images — здесь лежат картинки.
- styles — здесь лежат файлы CSS.
- .htaccess — перенаправляет все на один файл.
- index.php — здесь происходит начальная инициализация.
[php]
Bootstrap = index.php (содержимое):
<h5>Hello</h5>
.htaccess (содержимое):
RewriteEngine on
RewriteRule !\.(js|gif|jpg|png|css)$ index.php
[/php]
MVC — Bootstrap = index.php
[php]
set_include_path(get_include_path()
.PATH_SEPARATOR.’application/controllers’
.PATH_SEPARATOR.’application/models’
.PATH_SEPARATOR.’application/views’);
function __autoload($class){
require_once($class.’.php’);
}
$front = FrontController::getInstance();//описываем контроллер
$front->route(); //встроенный метод
echo $front->getBody();
[/php]
MVC — FrontController
[php]
class FrontController { //описываем свой контроллер
protected $_controller, $_action, $_params, $_body;//свойства содержат: текущий контроллер,action, параметры, контент, который возвращается
static $_instance;
public static function getInstance() {
if(!(self::$_instance instanceof self))
self::$_instance = new self();
return self::$_instance;
}
}
[/php]
MVC: FrontController::__construct ()
[php]
private function __construct(){ //приватный консруктор, чтобы нельзя было создать экземпляр
$request = $_SERVER[‘REQUEST_URI’]; //принимаем параметры из адресной строки
$splits = explode(‘/’, trim($request,’/’)); //делим по слэшу
//выбираем controller
$this->_controller =!empty($splits[0])?ucfirst($splits[0]).’Controller’:’indexController’;
//выбираем action
$this->_action =!empty($splits[1])?$splits[1].’Action’:’indexAction’;
//есть ли параметры и их значения?
if(!empty($splits[2])){
$keys = $values = array(); //массив, в ключах будут id, в зачениях — значения
for($i=2, $cnt = count($splits);$i<$cnt;$i++){
if($i%2 == 0){
//Четное = ключ (параметр)
$keys[] = $splits[$i]; //закидываем четный параметр
}else{
//Значение параметра;
$values[] = $splits[$i];}
}
$this->_params = array_combine($keys, $values); //объединяем
}
}
[/php]
MVC: FrontController::route ()
[php]
public function route(){
if(class_exists($this->getController())){ //существует ли класс?
$rc = new ReflectionClass($this->getController()); //создаем ReflectionClass
if($rc->implementsInterface(‘IController’)){ //опишем пустой интерфейс, его будут наследовать все контроллеры
if($rc->hasMethod($this->getAction())){ //есть ли у него соответствующий метод
$controller = $rc->newInstance();//создаем контроллер
$method = $rc->getMethod($this->getAction()); //создаем метод
$method->invoke($controller); //вызываем этот метод
}else{
throw new Exception(«Wrong Action»);} //отлавливаем ошибку
}else{
throw new Exception(«Wrong Interface»);} //отлавливаем ошибку
}else{
throw new Exception(«Controller»);} //отлавливаем ошибку
}
[/php]
MVC: FrontController методы
Опишем наши методы, которые применяются во FrontController:
[php]
public function getParams(){
return $this->_params;}
public function getController(){
return $this->_controller;}
public function getAction(){
return $this->_action;}
public function getBody(){
return $this->_body;}
public function setBody($body){
$this->_body = $body;}
[/php]
Т.е. по сути мы описали свой фреймворк. Но можем использовать и встроенный.