Php 试图理解MVC。我的网站的实现距离有多近?

Php 试图理解MVC。我的网站的实现距离有多近?,php,model-view-controller,design-patterns,Php,Model View Controller,Design Patterns,对于web编程来说还是很新的,我本身并没有具体的问题,但我想知道这种设计与MVC在这些条件下的实现有多接近db.php只连接到数据库 我不想回答“使用CodeIgniter、CakePHP、Zend Framework等”,因为我很可能最终会这样做,但现在我想了解如何在一个典型的网站中使用开箱即用的PHP和HTML实现一个基本的MVC模式。另外,我已经阅读了Model view controller的wikipedia页面,我仍然不知道如何在这种情况下应用它 我真的不喜欢我现在使用的解决方案,因

对于web编程来说还是很新的,我本身并没有具体的问题,但我想知道这种设计与MVC在这些条件下的实现有多接近
db.php
只连接到数据库

我不想回答“使用CodeIgniter、CakePHP、Zend Framework等”,因为我很可能最终会这样做,但现在我想了解如何在一个典型的网站中使用开箱即用的PHP和HTML实现一个基本的MVC模式。另外,我已经阅读了Model view controller的wikipedia页面,我仍然不知道如何在这种情况下应用它

我真的不喜欢我现在使用的解决方案,因为它看起来仍然很杂乱无章。我不确定我到底是什么意思,但它似乎有点异味。随着大量的变量,它仍然显得相当混乱和不雅。网站的许多部分似乎都在为访问其他部分而苦苦挣扎,而且整体设计有点糟糕。我不断地将大量变量传递给构造函数,而整个解决方案似乎非常不灵活。我不知道;我仍然有点困惑,在这个上下文中控制器是什么,或者我是否有控制器。希望有人能缓解这一切困惑

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();
?>
submissions\u model.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>
public function getSearch() {
    if (isset($_GET['search']))
        return $_GET['search'];
    else
        return '';
}
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);
        }
    }
}

网络世界中的MVC工作原理如下:

  • 控制器处理传入的请求并生成模型
  • 视图呈现包含模型数据的HTML
  • 将该基本结构进一步扩展:

  • A处理所有传入的请求。它根据URL选择要调用的控制器
  • 控制器生成模型并将其与(可选)视图名称一起返回给前端控制器
  • 如果控制器未返回视图名称,则前端控制器根据约定确定要呈现的视图(例如,使用了哪个控制器,或者请求了哪个URL)
  • 前端控制器委托给视图(例如,使用PHP include)

  • 这是一个超级基本的MVC设置,您可以在此基础上进行扩展。

    网络世界中的MVC工作原理如下:

  • 控制器处理传入的请求并生成模型
  • 视图呈现包含模型数据的HTML
  • 将该基本结构进一步扩展:

  • A处理所有传入的请求。它根据URL选择要调用的控制器
  • 控制器生成模型并将其与(可选)视图名称一起返回给前端控制器
  • 如果控制器未返回视图名称,则前端控制器根据约定确定要呈现的视图(例如,使用了哪个控制器,或者请求了哪个URL)
  • 前端控制器委托给视图(例如,使用PHP include)

  • 这是一个超级基本的MVC设置,您可以在此基础上进行扩展。

    我最近也遇到了这个难题,经过一些尝试和错误后,得出了以下与ericacm的答案略有不同的设计模式实现:

  • 前端控制器处理所有传入的请求,并将其委托给所需的控制器。这通常包括以某种方式将传入URL映射到文件路径,但也可能是加载一些初始数据或基类,或者设置一些应用程序环境设置

  • 加载控制器后,在出现新请求之前,不会再次使用前控制器。(缺少更好的词)“Main”控制器现在加载任何必需的模型类,并调用其中的方法以获取任何必需的数据

  • 该模型具有从数据源(即数据库)提取和处理请求数据的方法。除其他型号和DB连接外,它无法访问任何内容

  • 加载数据后,控制器加载相关视图类,并将数据“推送”到视图中保存的变量中

  • 视图类本身没有“更高”的逻辑函数,也无法访问模型或控制器方法。它实际上只是通过各种
    getSomeVar()
    renderSomeData()
    方法提供将数据处理到所需输出媒体(即html)的方法

  • 最后,控制器调用视图的方法来呈现页面,此时控制器的工作完成。视图将加载必要的模板文件,这些文件将被解释为生成浏览器的输出

  • 模板文件大多是结构化HTML,没有编程逻辑。数据仅通过调用视图中的各种
    renderSomething()
    方法加载到页面中


  • 我的想法是控制器应该控制一切


    hth

    最近我自己也经历了这一困境,经过一些尝试和错误后,得出了以下设计模式实现,这与ericacm的答案略有不同:

  • 前端控制器处理所有传入的请求,并将其委托给所需的控制器。这通常包括以某种方式将传入URL映射到文件路径,但也可能是加载一些初始数据或基类,或者设置一些应用程序环境设置

  • 加载控制器后,在出现新请求之前,不会再次使用前控制器。(缺少更好的词)“Main”控制器现在加载任何必需的模型类,并调用其中的方法以获取任何必需的数据

  • 该模型具有从数据源(即数据库)提取和处理请求数据的方法。除其他型号和DB连接外,它无法访问任何内容。