КОнтакты, предложения, отзывы

.rar или .zip
Вложение
Онлайн-чат
На этом сайте, вы найдёте полезную информацию, практические советы в области веб-программирования, веб-дизайна и веб-разработок в целом. Мы с удовольствием поделимся с вами реальными примерами и решениями задач, связанных с jQuery , JavaScript , PHP и MySQL , версткой сайтов , поможем разобраться новичкам с современными технологиями, такими как Ajax , HTML5 , CSS3 и многими другими.

Шаблон проектирования MVC

Всем привет. Model-view-controller (MVC, «модель-представление-контроллер», «модель-вид-контроллер») — это схема использования нескольких шаблонов проектирования, с помощью которых модель приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные.

Шаблон по сути прост, как всё гениальное. Схема его работы такова: пользователь запрашивает определённый url, на основе строки запроса вызывается нужный класс контроллера. который взаимодействует с моделью для получения данных из внешних источников (из БД, например) и подключает нужный html или php-файл вида, передавая в него полученные данные. Контроллер - связующее звено между моделью и видом. Всеми операциями по получению, обработке данных и передачи их в контроллер должна заниматься модель
Все запросы обрабатывает индексный файл php. Для этого в .htaccess настраиваются редиректы на него в случае если запрос не находит такой папки или файла. Далее в игру вступает класс Router, который обрабатывает строку url-запроса и вызывает нужный контроллер с передачей в него параметров из строки url-запроса.


AddDefaultCharset utf-8

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /

Внимание :: Все пути и ссылки на файлы при включенных редиректах .htaccess должны быть абсолютными. Ссылки на изображения или другой какой-то контент, должны иметь путь вида "/img/1.png" т.е. от корня сайта. Файлы, которые подключаются через include или require, должны иметь путь вида
dirname(__FILE__) . "/file.html"

Файл index.php:

  
  ob_start();
  session_start(); 
  
  header ("Content-Type:text/html; charset=UTF-8");
  
  // Общие настройки
  ini_set('display_errors',1);
  error_reporting(E_ALL);
  mb_internal_encoding('utf-8');
  
  // константа абсолютного пути
  define('ROOT', dirname(__FILE__));
  
  require_once ROOT."/template/Twig/Autoloader.php";
  \Twig_Autoloader::register();
  
  // функция автозагрузки классов
  function myAutoload($classname){
    if(preg_match('/\\\\/', $classname)){
        $path = str_replace('\\', DIRECTORY_SEPARATOR, $classname);
    }else{
        $path = str_replace('_', DIRECTORY_SEPARATOR, $classname);
    }
    require_once(ROOT.DIRECTORY_SEPARATOR."$path.php");
  }
  
  // регистрация функции автозагрузки
  spl_autoload_register('myAutoload');

  // Вызов Router
  $router = new \components\Router();// вызов роутера
  $router->run();
  
  ob_end_flush();
  

Router.php - ответственен за принятие решения о том, какой контроллер будет обрабатывать данный запрос и передачу параметров из url:


namespace components;

class Router{
  private $routes; // свойство для хранения массива роутов

  public function __construct(){
    // Путь к файлу с роутами
    $routesPath = ROOT . '/config/routes.php';

    // Получаем роуты из файла
    $this->routes = include($routesPath);
  }

  /**
   * Возвращает строку запроса
   */
  private function getURI(){
    if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
    }
  }

  /**
   * Метод для обработки запроса
   */
  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;
        }
      }
    }
  }

}


// Файл routes.php, в котором пишете маршруты и получаете из них данные, для примера :
return array(
  '^([^\/]+)?$' => 'mainPage/index/$1',// actionIndex в mainPageController, передать строку из $_SERVER['REQUEST_URI'])
);

Модель и контроллер предлагаю рассмотреть самостоятельно, хочу показать здесь только класс ACore, который является родительским для всех контроллеров:
namespace controllers;

abstract class ACore{
	
  protected $m;
  protected $loader;
  protected $twig;

  public function __construct(){
    $this->m = new \models\Model();
    $this->loader = new \Twig_Loader_Filesystem(ROOT.'/template/views');// указываем папку, в которой лежат файлы шаблонов
    $this->twig = new \Twig_Environment($this->loader);
  }

  protected function get_header($header, $vars=array()){
    $tpl = $this->twig->loadTemplate($header);
    echo $tpl->render($vars);
  }
  
  protected function get_footer($footer='footer.html'){
    $tpl = $this->twig->loadTemplate($footer);
    echo $tpl->render(array());
  }
	
}


Насчёт шаблонизатора Twig в файле twigGuide.html описаны базовое примеры его использования.

Итак, какие преимущества даёт нам использование шаблона MVC?
Прежде всего это чёткое разделение логики представления (интерфейса пользователя) и логики приложения.
Поддержка различных типов пользователей, которые используют различные типы устройств является общей проблемой наших дней. Предоставляемый интерфейс должен различаться, если запрос приходит с персонального компьютера или с мобильного телефона. Модель возвращает одинаковые данные, единственное различие заключается в том, что контроллер выбирает различные виды для вывода данных.
Помимо изолирования видов от логики приложения, концепция MVC существенно уменьшает сложность больших приложений. Код получается гораздо более структурированным, и, тем самым, облегчается поддержка, тестирование и повторное использование решений.

2016.07.27
jpg

Войдите или Зарегистрируйтесь чтобы оставить комментарий

Комментарии


    Яндекс.Метрика Яндекс.Метрика