Шаблон MVC очень распространен в архитектуре веб-сайтов. Это позволяет нам создавать трехуровневое приложение, отделяя полезные слои от кода, помогая дизайнерам и разработчикам работать вместе и улучшая наши возможности по поддержке и расширению существующих приложений.
Вид
«Просмотр» в основном относится к конечному результату, который мы отправляем в веб-браузер, например, к HTML-коду, сгенерированному нашим сценарием. Говоря о представлениях, многие думают о шаблонах, однако корректность названия шаблонных решений представлениями сомнительна.
Вероятно, самое важное в представлении — это то, что оно должно быть «самосознательным». Когда представление визуализируется, его элементы осознают свою роль в более широкой структуре.
На примере XML можно сказать, что при анализе XML API DOM обладает такими знаниями, что узел в дереве DOM знает, где он находится и что он содержит. (Когда узел в XML-документе анализируется с помощью SAX, это имеет смысл только при анализе узла.)
В большинстве схем шаблонов используются простые процедурные языки и такие теги шаблонов:
<p>{some_text</p >
<p>{some_more_text}</p>
Они не имеют никакого значения в документе, они означают лишь то, что PHP заменит его чем-то другим.
Если вы согласны с таким расплывчатым описанием представлений, вы также согласитесь с тем, что большинство шаблонных решений не позволяют эффективно разделить представления и модели. Тег шаблона будет заменен всем, что хранится в модели.
Задайте себе несколько вопросов при реализации представления: «Легко ли заменить все представление?», «Сколько времени занимает реализация нового представления?», «Легко ли заменить язык описания представления?» (Например, использование SOAP в том же представлении. Документ заменяет документ HTML)"
Модель (Модель)
Модель представляет собой логику программы. (Часто называемый бизнес-уровнем в программах корпоративного уровня)
В общем, задача модели — преобразовать исходные данные в данные, содержащие некоторый смысл, который будет отображаться представлением. Обычно модель инкапсулирует запросы к данным, возможно, через некоторый абстрактный класс данных (уровень доступа к данным) для реализации запроса. Например, если вы хотите рассчитать годовое количество осадков в Великобритании (просто чтобы найти хорошее место для отдыха), модель получит данные о ежедневном количестве осадков за десять лет, рассчитает среднее значение и передаст его в представление.
Контроллер (контроллер)
просто означает, что контроллер — это первая часть входящего HTTP-запроса в веб-приложении. Он проверяет полученный запрос, например некоторые переменные GET, и отправляет соответствующую обратную связь. Трудно начать писать другой PHP-код, пока вы не напишете свой первый контроллер. Чаще всего используется такая структура, как оператор switch в index.php:
<?php
переключатель ($_GET['viewpage']) {
дело «новости»:
$page=новый NewsRenderer;
перерыв;
случай «ссылки»:
$page=новый LinksRenderer;
перерыв;
по умолчанию:
$page=новый HomePageRenderer;
перерыв;
}
$страница->дисплей();
?>
Этот код сочетает в себе процедурный и объектно-ориентированный код, но для небольших сайтов это обычно лучший выбор. Хотя приведенный выше код еще можно оптимизировать.
Контроллеры на самом деле представляют собой элементы управления, используемые для запуска привязок между данными модели и элементами представления.
Пример
Вот простой пример использования шаблона MVC.
Сначала нам нужен класс доступа к базе данных, который является обычным классом.
<?php
/**
* Простой класс для запроса MySQL.
*/
класс DataAccess {
/**
*Частный
* $db хранит ресурс базы данных
*/
вар $дб;
/**
*Частный
* $query хранит ресурс запроса
*/
var $query; // Ресурс запроса
//! Конструктор.
/**
* Создает новый объект DataAccess.
* @param $host string имя хоста для сервера базы данных
* @param $user string пользователь сервера базы данных
* @param $pass string пароль пользователя dbserver
* @param $db строковое имя базы данных
*/
функция DataAccess ($host,$user,$pass,$db) {
$this->db=mysql_pconnect($host,$user,$pass);
mysql_select_db($db,$this->db);
}
//! Аксессор
/**
* Извлекает ресурсы запроса и сохраняет их в локальном элементе.
* @param $sql строка запроса к базе данных, который необходимо выполнить.
* @return void
*/
функция выборки ($ SQL) {
$this->query=mysql_unbuffered_query($sql,$this->db // Выполняем запрос здесь);
}
//! Аксессор
/**
* Возвращает ассоциативный массив строки запроса
* @return смешанный
*/
функция getRow () {
if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC))
вернуть $строку;
еще
вернуть ложь;
}
}
?>
Поместите модель сверху.
<?php
/**
* Извлекает «продукты» из базы данных.
*/
класс ProductModel {
/**
*Частный
* $dao экземпляр класса DataAccess
*/
вар $дао
//! Конструктор.
/**
* Создает новый объект ProductModel.
* @param $dbobject экземпляр класса DataAccess
*/
функция ProductModel (&$dao) {
$this->dao=& $dao;
}
//! Манипулятор
/**
* Сообщает $dboject сохранить этот запрос как ресурс.
* @param $start строка, с которой начинается
* @param $rows количество строк для выборки
* @return void
*/
функция listProducts($start=1,$rows=50) {
$this->dao->fetch("SELECT * FROM Products LIMIT ".$start.", ".$rows);
}
//! Манипулятор
/**
* Сообщает $dboject сохранить этот запрос как ресурс.
* @param $id первичный ключ для строки
* @return void
*/
список функцийProduct($id) {
$this->dao->fetch("SELECT * FROM Products WHERE PRODUCTID="".$id."'");
}
//! Манипулятор
/**
* Извлекает товар как ассоциативный массив из $dbobject.
* @return смешанный
*/
функция getProduct() {
если ( $product=$this->dao->getRow() )
вернуть $продукт;
еще
вернуть ложь;
}
}
?>
Следует отметить, что взаимодействие между моделью и классом доступа к данным никогда не превышает одной строки — несколько строк не отправляются, что быстро замедлит работу программы. Той же программе необходимо сохранить в памяти только одну строку (Row) для класса, использующего схему — остальное отдается сохраненному ресурсу запроса (resource query) — другими словами, мы позволяем MYSQL сохранять результаты за нас.
Далее идет представление — я удалил HTML, чтобы сэкономить место, полный код вы можете посмотреть в этом посте.
<?php
/**
* Связывает данные о продукте с HTML-рендерингом.
*/
класс ProductView {
/**
*Частный
* $model экземпляр класса ProductModel
*/
вар $модель
/**
*Частный
* $output отображаемый HTML хранится здесь для отображения.
*/
вар $выход;
//! Конструктор.
/**
* Создает новый объект ProductView.
* @param $model экземпляр класса ProductModel
*/
функция ProductView (&$модель) {
$this->model=& $model;
}
//! Манипулятор
/**
* Создает верхнюю часть HTML-страницы.
* @return void
*/
заголовок функции () {
}
// Манипулятор!
/**
* Создает нижнюю часть HTML-страницы.
* @return void
*/
function footer () {
}
// Манипулятор!
/**
* Отображает один продукт
* @return void
*/
функция productItem($id=1) {
$this->model->listProduct($id);
while ( $product=$this->model->getProduct() ) {
// Привязываем данные к HTML
}
}
//! Манипулятор
/**
* Строит таблицу продуктов.
* @return void
*/
функция ProductTable($rownum=1) {
$rowsperpage='20';
$this->model->listProducts($rownum,$rowsperpage);
while ( $product=$this->model->getProduct() ) {
// Привязываем данные к HTML
}
}
//! Аксессор
/**
* Возвращает визуализированный HTML.
* @return строка
*/
отображение функции () {
вернуть $this->вывод;
}
}
?>
Резюме: Шаблон MVC очень распространен в архитектуре веб-сайтов. Это позволяет нам создавать трехуровневое приложение, отделяя полезные слои от кода, помогая дизайнерам и разработчикам работать вместе и улучшая наши возможности по поддержке и расширению существующих приложений. Эта статья познакомит вас с реализацией шаблона MVC в PHP.
Теги: PHP MVC Шаблон MVC Веб-сайт PHP
Oracle помогает вам получить точную информацию о каждом логистическом звене
Oracle помогает вам получить точное представление о каждом логистическом звене. Наконец, мы реализуем представление в виде подкласса контроллера.
<?php
/**
* Управляет приложением
*/
класс ProductController расширяет ProductView {
//! Конструктор.
/**
* Создает новый объект ProductController.
* @param $model экземпляр класса ProductModel
* @param $getvars входящие переменные метода HTTP GET.
*/
функция ProductController (&$model,$getvars=null) {
ProductView::ProductView($модель);
$this->header();
переключатель ( $getvars['view'] ) {
кейс «продукт»:
$this->productItem($getvars['id']);
перерыв;
по умолчанию:
if (пусто ($getvars['rownum'])) {
$this->productTable();
} еще {
$this->productTable($getvars['rownum']);
}
перерыв;
}
$this->нижний колонтитул();
}
}
?>
Обратите внимание, что это не единственный способ реализации MVC — например, вы можете использовать контроллеры для реализации моделей и одновременной интеграции представлений. Это всего лишь один из способов продемонстрировать закономерность.
Наш файл index.php выглядит так:
<?php
require_once('lib/DataAccess.php');
require_once('lib/ProductModel.php');
require_once('lib/ProductView.php');
require_once('lib/ProductController.php');
$dao=& new DataAccess('localhost','user','pass','dbname');
$productModel=& новая модель продукта($dao);
$productController=& новый ProductController($productModel,$_GET);
echo $productController->display();
?>
Красиво и просто.
У нас есть несколько приемов использования контроллеров, в PHP вы можете сделать это:
$this->{$_GET['method']}($_GET['param']);
Одно из предложений заключается в том, что вам лучше определить форму пространства имен URL-адреса программы. (пространство имен), тогда оно будет более стандартизировано, например:
"index.php?class=ProductView&method=productItem&id=4"
Через него мы можем обрабатывать наш контроллер следующим образом:
$view=new $_GET['class'];
$view->{$_GET['method']($_GET['id']);
Иногда создание контроллера затруднено, например, когда вы балансируете между скоростью разработки и адаптивностью. Хорошим местом для вдохновения является Java Struts группы Apache, чьи контроллеры полностью определяются XML-документами.