MVC ... как и почему, и какие еще хорошие варианты есть (PHP)? - PullRequest
3 голосов
/ 12 октября 2009

Все примеры, которые я видел, о том, что и как должно быть в MVC, использовали классы в качестве моделей, классы в качестве контроллера и HTML-шаблоны в качестве представления. И все они состояли из одного скрипта index.php и разных запросов в URL для запуска всего сайта.

Так что все они были чем-то вроде ...

MODEL
class User{
    function getUser($userID){
      $sql = mysql_query('SELECT name......');
      // more code.....
      return $array
    }
}

VIEW
<h2><?php echo $user['name']; ?></h2>

CONTROLLER
class Controller{
    $userModel = new User;
    $userInfo = $userModel->getUser($id);

    $template = new Template('usertemplate.tpl');
    $template->setVariables($userInfo);
    $template->display();
}

Я понимаю, почему модель состоит из классов, которые просто получают и сохраняют данные (хотя я предполагаю, что классы не всегда необходимы и функции могут использоваться). Я понимаю, почему шаблон состоит в основном из HTML. Но я не понимаю, почему контроллер является классом. Я бы предположил, что контроллером является процедурный скрипт (например, userprofile.php, который получает данные пользователей из модели и отправляет их в шаблон для отображения).

Кроме того, мне было интересно, почему каждый урок, который я прочитал, касался переписывания модов и использования одной страницы с запросами в URL, такими как «index.php? User = 1» или index.php? News = 3 для запустить весь сайт. Что не так с наличием отдельных страниц, таких как user_profile.php? Id = 1 или news.php? Id = 3 ...

Может кто-нибудь помочь мне с быстрым "учебным пособием" и объяснениями по пути. Например ... как будет реализована форма регистрации с использованием MVC, что будет, где и почему? * 1010 большое спасибо *

PS. какие еще существуют шаблоны дизайна

Ответы [ 4 ]

1 голос
/ 12 октября 2009

Большой «выигрыш» контроллера в PHP-версии MVC заключается в том, что вы избавляетесь от необходимости иметь отдельную страницу PHP для каждого URL-адреса, на который отвечает ваше приложение.

Когда для каждого URL создается новая отдельная страница, вы ожидаете, что ваши разработчики (или вы сами) добавите необходимые библиотеки и таким же образом инициализируете механизм шаблонов / макета. Даже когда вы один разработчик, искушение отойти от «стандартного» способа работы обычно оказывается слишком сильным, что означает каждая URL-страница / PHP-страница в конечном итоге является собственным мини-приложением вместо того, чтобы каждая URL / PHP-страница была частью одного и того же приложения. Когда у вас есть несколько разработчиков, это гарантированно произойдет.

Конечными результатами являются страницы и компоненты, которые не очень хорошо работают друг с другом и их трудно отлаживать (при том, что все висит в глобальном пространстве имен), что дает противоречивый опыт как пользователям, так и разработчикам, которым приходится работать. на проекте.

Фреймворки MVC также упрощают предоставление дружественных URL для вашего сайта. Обычно в системе маршрутизации достаточно того, что вам не нужно , чтобы прибегнуть к огромному количеству переменных строки запроса. Читаемые URL-адреса являются плюсом для SEO и опытных пользователей.

Наконец, хотя в большинстве магазинов это журавль в небе, когда у вас есть контроллер, методы на контроллере легко проверяются модулем. Хотя вы можете технически обернуть тестовый жгут вокруг сайта, не принадлежащего MVC, это всегда боль в заднице и никогда не работает так, как вам бы хотелось.

1 голос
/ 12 октября 2009

использование одной страницы с запросами в URL-адрес, такой как "index.php? user = 1", или index.php? news = 3, чтобы запустить весь сайт. Что плохого в том, чтобы иметь отдельный такие страницы, как user_profile.php? id = 1 или news.php? ID = 3 ...

Использование одной точки входа облегчает некоторые вещи, я полагаю:

  • Вам не нужно дублировать какую-либо часть кода в user_profile.php и news.php
  • Если вы хотите установить какой-либо фильтр (например, PHPIDS для безопасности или ACL, например), у вас есть только один файл для изменения, и это сделано для всего приложения.

PS. какие другие виды шаблонов дизайна Есть ли

Есть много шаблонов дизайна; Вы можете найти список в статье Design (информатика) , например, в википедии - со ссылками на страницу каждого из них, для более подробной информации.

0 голосов
/ 12 октября 2009

Есть несколько способов реализовать хорошее приложение, но я просто коснусь нескольких понятий. Эти понятия взяты из Samstyle PHP Framework.

Во-первых, у вас есть следующие компоненты: Модель ( Шлюз табличных данных ), View, View Controller и Backend Controller.

Этот контроллер вида фактически контролирует, как будет выглядеть представление (например, отображать форму регистрации). Backend Controller обрабатывает пользовательские данные на сервере и взаимодействует с моделью (базой данных).

Так что здесь мы можем легко интегрировать Post-Redirect-Get в него.

Скажем, у вас есть register.php для View Controller, который будет отображать форму и анализировать содержимое в файле шаблона HTML.

Пользователь использует форму, отправляет ее, а затем отправляет в Backend Controller deck.php . Backend Controller проверяет, проверяет, а затем передает данные в функции (Table Data Gateway), которые помогут вам взаимодействовать с базой данных. После завершения взаимодействия пользователь перенаправляется либо на страницу успеха, либо на страницу регистрации с ошибкой.

В модели (шлюз табличных данных) у вас фактически есть функции, которые принимают массив, а затем CRUD с базой данных.

0 голосов
/ 12 октября 2009

Нет ничего плохого в том, чтобы иметь отдельные сценарии для каждого действия, и фактически вы МОЖЕТЕ создать архитектуру MVC таким образом, не используя класс для контроллера. Сейчас я работаю над платформой MVC, которая поддерживает оба стиля.

В действительности важно сохранить разделение различных проблем. Логика базы данных используется в ваших моделях, логика макета - в шаблонах, а все остальное в контроллере.

Так что для действительно простого примера вы могли бы иметь скрипт "register.php" со следующим кодом

$signup_options = SignupOptions::getSignupOptions(); // Load some data      
require("register_form.php");  // Pass it to the view

А это сообщения в register_process.php

$username = $_REQUEST['username'];
$password = $_REQUEST['password'];
$email    = $_REQUEST['email'];
Users::Register( $username, $password, $email );
header( 'location: register_success.php' );

MVC подходит не для всех приложений, поэтому вы должны учитывать свою архитектуру для каждого проекта. Для многих сайтов просто наличие нескольких независимых скриптов работает нормально. Однако для более крупных и сложных приложений MVC зарекомендовал себя как надежный и масштабируемый способ разработки веб-приложений.

Другим распространенным шаблоном проектирования является «Помощник вида», в котором вы вызываете шаблон напрямую, а шаблон вызывает объект «Помощник», который выполняет бизнес-логику между шаблоном и моделями. Концепция похожа, но вы можете пропустить наличие дополнительного кода для шаблонов, в которых он не нужен, при этом сохраняя разделение задач, таких как MVC. (Разница заключается в том, что вы вызываете шаблон напрямую, а не вызываете контроллер).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...