Я наконец получаю MVC? - PullRequest
       6

Я наконец получаю MVC?

2 голосов
/ 05 января 2012

с учетом URL http://www.example.com/products.php

products.php содержит:

<?php
include ('model.inc');
$controller = new Controller;

class Controller
  function __construct()
  {
    $model = new Model;
    $this->model->model_methods();
    include ('view.inc');
  }
}
?>

model.inc содержит:

<?php
class Model {
  // methods that return data 
}
?>

view.inc содержит:

<html>
  <head>
  </head>
  <body>
    <!-- html plus php output -->
  </body>
</html>

Итак, products.php создает контроллер. Контроллер создает модель, выясняет, что делать, и манипулирует данными только с помощью методов модели и, наконец, передает все в представление. Единственный php в представлении - это вывод данных или прохождение через массив для вывода данных.

Я играл с несколькими легковесными php-фреймворками, которые реализуют MVC, но так много магии делается за кулисами, что я не знаю, наконец-то я это получу или нет. :)

Ответы [ 7 ]

4 голосов
/ 05 января 2012

Взгляните на эту статью MVC об ужасах кодирования .

Если вы думаете о том, что представляет собой модель - «модель» данных или подмножество данных -и о том, что представляет представление - конкретное «представление» данных - тогда легко понять, что этим двум объектам требуется что-то для маршрутизации информации между ними.Отсюда и контроллер.Поток должен быть M -> C -> V

Хороший тест, если вы «понимаете» MVC (и, следовательно, если ваше приложение - MVC), равен «Могу ли я обработать скин моего приложения?» Если вы можетеПодумайте о простом способе беспрепятственного применения различных скинов и стилей к вашим данным, тогда вам удалось отделить модель от представления, и ваш контроллер эффективен в том, что он делает.

Хотя я не знаюкак это на самом деле реализовано, я бы сказал, что StackExchange - отличный пример идеи MVC.Есть несколько сайтов, посвященных различным темам, но у всех них есть очень похожие типы «моделей» - очень похожие данные.Презентации - представления - могут свободно изменяться по своему усмотрению, и контроллер выполняет всю логическую работу.Это может быть своего рода надуманный пример, но я думаю, что он работает концептуально, если не технически.

3 голосов
/ 05 января 2012

Лично я думаю, что ваш контроллер несет ответственность за слишком много. Инстанцирование модели и вида внутри контроллера «кажется» неправильным. Контроллер должен нести ответственность только за получение данных от Model и передачу их в View. Прямо сейчас Контроллер отвечает за создание Модели И он эффективно действует как Представление, включая HTML.

Важной частью здесь является то, что каждый объект в идеале несет особую ответственность.

  • Модель = данные, содержащие ваше приложение (это действительно слой, а не объект)
  • Просмотр = окончательный вывод, отправленный пользователю
  • Контроллер = дать материал для просмотра из модели

Я рекомендую вам создать какой-то объект типа "front controller", который обрабатывает соответствующие экземпляры объектов и отвечает за настройку всех различных частей.


Ах, хорошо, но как контроллер "передает" данные представлению?

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

class Controller {

    protected $viewData = array();

    public function index() {
        $data = $this->Model->getData();
        $this->giveToView('data', $data);
    }

    public function getViewData() {
        return $this->viewData;
    }

    protected function giveToView($key, $value) {
        $this->viewData[$key] = $value;
    }

}

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

class View {

    protected $viewData;

    public function setViewData(array $data) {
        $this->viewData = $data;
    }

    public function renderViewFile($filePath) {
        // from example the variable $data is now available in this scope
        // to include the $filePath
        extract($this->viewData);
        include $filePath;
    }

}

Очевидно, что это упрощенный пример, но основная предпосылка остается прежней.

2 голосов
/ 05 января 2012

Идея MVC состоит в том, чтобы отделить логику вашего приложения (бизнес-логика, бизнес-уровень, средний уровень или средний уровень), ввод (url, публикация данных, получение данных) и вывод (пользовательский интерфейс - html в вашем случае).

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

Читайте здесь: MVC в Википедии

Я бы предпочел CodeIgniter - очень статичный набор функций, некоторые из которых названы Model, другие Controller, и есть Views плюс множество утилит, позволяющих вам сосредоточиться на логике приложения и макет, не теряя свободы кодирования в PHP (кажется, вы используете PHP). Если вы не обнаружите, что это не подходит, но это может произойти с любой структурой.

1 голос
/ 05 января 2012

Да. Это более или менее MVC. Основная суть MVC заключается в следующем:

  1. Контроллеры связывают ваши модели и представления вместе и обычно заботятся о передаче данных модели в представление.
  2. Модели управляют вашей бизнес-логикой.
  3. Представления обрабатывают логику представления и представления.

Я бы определенно потратил время на изучение PHP MVC-фреймворка, такого как Kohana, Lithium, Symfony или Cake, поскольку все они предоставляют массу утилит, которые сделают вашу жизнь проще. Они также могут обрабатывать автоматическую маршрутизацию, которая делает ваши URL чище и помогает абстрагировать URL от их прямых подключений к контроллерам.

1 голос
/ 05 января 2012

Еще не совсем!

Часть /products.php обычно абстрагируется. Имя файла соответствует router во время выполнения, что соответствует его соответствующему контроллеру. В этом случае у вас может быть Products контроллер по имени, но вы можете сопоставить (через маршрутизацию) запрос things.php с Products контроллером.

Как правило, существует еще одна «магия» выполнения / инициализации, которая вызывает соответствующую модель / представление на основе запроса - например, это займет /products.php, изменится на Product и будет искать модель, контроллер, и вид с именем Product.inc

0 голосов
/ 05 января 2012

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

Очевидно, что есть много других тем для обсуждения, если вы хотите быть хардкорным макетом MVC.

Например

  1. Разделение вашего приложения на папки, называемые контроллерами, представлениями и моделями
  2. Создание хорошего слоя данных, чтобы максимально упростить ваши модели
  3. Интеграция логики помощника / виджета для повторного использования визуальных компонентов
  4. Интеграция механизма маршрутизации с mod_rewrite для создания чистых URL

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

0 голосов
/ 05 января 2012

Да, это основная основа шаблона MVC.Контроллер можно рассматривать как мозг, который выясняет, какие действия предпринять.В зависимости от этого действия он может взаимодействовать с моделями для получения необходимых данных для визуализации представления.Затем он делает необходимые данные доступными для представления и отображает HTML для браузера.

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