mvc

MVC шаблон — структура, FrontController

Структура MVC шаблона проектирования

Как правило, у всех фреймворков выработана стандартная структура (может немного варьироваться):

  • application.
  1. contrlollers,
  2. models,
  3. view.
  • images — здесь лежат картинки.
  • styles — здесь лежат файлы CSS.
  • .htaccess — перенаправляет все на один файл.
  • index.php — здесь происходит начальная инициализация.
Bootstrap = index.php (содержимое):
<h5>Hello</h5>

.htaccess (содержимое):

RewriteEngine on
RewriteRule !\.(js|gif|jpg|png|css)$ index.php

MVC — Bootstrap = index.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();

MVC — FrontController

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;
}
}

MVC: FrontController::__construct ()

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); //объединяем
}
}

MVC: FrontController::route ()

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");} //отлавливаем ошибку
}

MVC: FrontController методы

Опишем наши методы, которые применяются во FrontController:

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;}

Т.е. по сути мы описали свой фреймворк. Но можем использовать и встроенный.




Добавить комментарий

Ваш e-mail не будет опубликован.