Пытаюсь понять MVC.Насколько близка эта реализация для моего сайта? - PullRequest
1 голос
/ 07 апреля 2011

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

Я бы хотел остаться в стороне от ответов типа «Используйте CodeIgniter, CakePHP, Zend Framework и так далее», потому что я, скорее всего, в конечном итоге собираюсь это сделать, но сейчас я хотел бы понять, как реализовать шаблон barebones MVC на типичном веб-сайте с использованием готовых PHP и HTML. Кроме того, я прочитал страницу википедии для Model-view-controller, и я все еще не уверен, как применить ее в этих обстоятельствах.

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

index.php

<?php
require('db.php');
require('header_model.php');
require('submissions_model.php');
require('template.php');

$headerModel = new HeaderModel();
$page = $headerModel->getPage();
$sort = $headerModel->getSort();
$search = $headerModel->getSearch();

$submissionsModel = new SubmissionsModel($sort, $page, $resultsPerPage, $search);
$submissions = $submissionsModel->getSubmissions();
$outcomeCount = $submissionsModel->getOutcomeCount();

$index_view = new Template('index_view.php', array(
    'header' => new Template('header.php'),
    'menu' => new Template('menu.php', array('sort' => $sort)),
    'submissions' => new Template('submissions.php', array('submissions' => $submissions)),
    'pagination' => new Template('pagination.php', array('page' => $page, 'resultsPerPage' => $resultsPerPage, 'outcomeCount' => $outcomeCount, 'sort' => $sort)),
    'footer' => new Template('footer.php')
));

$index_view->render();
?>

фрагмент index_view.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>My Website</title>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <link href="styles.css" rel="stylesheet" type="text/css"/>
        <link href="favicon.png" rel="shortcut icon" />
    </head>
    <body>
        <?php
        $this->header->render();
        $this->menu->render();
        $this->submissions->render();
        $this->pagination->render();
        $this->footer->render();
        ?>
    </body>
</html>

фрагмент header_model.php

public function getSearch() {
    if (isset($_GET['search']))
        return $_GET['search'];
    else
        return '';
}

фрагмент submissions_model.php

class SubmissionsModel {
    private $sort;
    private $page;
    private $resultsPerPage;
    private $search;

    public $submissions;
    public $outcomeCount;

    public function __construct($sort, $page, $resultsPerPage, $search) {
        $this->sort = $sort;
        $this->page = $page;
        $this->resultsPerPage = $resultsPerPage;
        $this->search = $search;

        $this->initialize();
    }

    private function initialize() {
        $submissionQuery = $this->getSubmissionQuery($this->search);
        $this->outcomeCount = mysql_num_rows($submissionQuery);
        $this->submissions = array();

        while ($row = mysql_fetch_assoc($submissionQuery)) {    
            $voteblock = $this->getVoteblock($row);
            $tags = $this->getTags($row);
            $commentCount = mysql_num_rows(mysql_query("SELECT id FROM comments WHERE submissionID = $row[id]"));
            $this->submissions[] = array('submission' => $row, 'upvote' => $voteblock['upvote'], 'votes' => $voteblock['votes'], 'downvote' => $voteblock['downvote'], 'tags' => $tags, 'commentCount' => $commentCount);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 15 августа 2011

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

  1. Фронт-контроллер обрабатывает все входящие запросы и делегирует требуемый контроллер. Обычно это состоит из сопоставления входящего URL-адреса с путем к файлу, но вы также можете загружать некоторые исходные данные или базовый класс или устанавливать некоторые параметры среды приложения.

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

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

  4. После загрузки данных контроллер загружает соответствующий класс View и «помещает» данные в переменные, содержащиеся в представлении.

  5. Сам класс View не имеет «высших» логических функций и не имеет доступа к методам Model или Controller. Это действительно только для предоставления методов для обработки данных на требуемый выходной носитель (например, html) с помощью различных методов getSomeVar() или renderSomeData().

  6. Наконец, Controller вызывает метод View для визуализации страницы, после чего работа Controllers завершается. В представлении загрузятся необходимые файлы шаблонов, которые будут интерпретированы для создания выходных данных для браузера.

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


Я думал о том, что Контролер должен контролировать ( duh ), все!

НТН

0 голосов
/ 08 апреля 2011

MVC в мире Интернета работает так:

  1. Контроллер обрабатывает входящий запрос и генерирует модель.
  2. Представление отображает HTML, включая данные модели.

Взяв эту базовую структуру и расширив ее немного дальше:

  1. A Фронт-контроллер обрабатывает все входящие запросы. На основании URL-адреса выбирается контроллер для вызова.
  2. Контроллер генерирует модель и возвращает ее на фронтальный контроллер вместе с (необязательно) именем вида.
  3. Если контроллер не возвращал имя представления, то Front Controller определяет, какое представление следует отобразить по соглашению (например, какой контроллер использовался или какой URL был запрошен).
  4. Передний контроллер делегирует представление (например, с использованием PHP include).

Это супер базовая установка MVC, которую вы можете расширить.

...