0

我正处于使用 PHP 学习模型、视图、控制器框架的早期阶段。多亏了这里的教程,我已经掌握了窍门。据我了解,控制器将调用模型,以便可以运行适当的代码,以便正确呈现可查看的内容。

问题是,基于那个特定的教程,我似乎必须为每个页面创建一个全新的文件,只是为了调用模型以呈现数据可见。

例如,在我的 controller.php 文件中,我有:

require_once("model.php");  

class Controller 
{  
    public $file;
    public $league;

    public function __construct($file, $league)  
    {
        $this->file = $file;  
        $this->league = $league;
    }   


    public function invoke()  
    {
        // Everything that needs to be done in PHP will be done here so that once 
        // whatever file is included, it will just fit in fine and echo out perfectly
        require_once($this->file.".php"); 
    }
}

在我的 model.php 文件中,我有:

class Model 
{
    private $file;
    private $league;

    public function __construct($file, $league)
    {
        $this->file = $file;
        $this->league = $league;
    }

    More code. You get the idea...
}

在我的 teams.php 文件中,我有:

$controller = new Controller("teams", "nba");  
$controller->invoke();

但是,由于teams.php 必须调用模型并且最终需要require_once("teams.php"),所以我必须为视图创建一个全新的文件。因此,现在显示将出现在 teams_display.php 上。无论如何,mod rewrite 是否可以帮助促进所有页面都发生在 index.php 文件中的框架,同时给用户一种他们不是的错觉?

4

2 回答 2

2

MVC 不是一个框架,而是一种设计模式。本教程将帮助您理解 MVC 模式,但如果您想使用真正的框架,您可以查看Zend Framework

在您的情况下 index.php 是入口点,mod rewrite 将所有请求重定向到 index.php,index.php 根据用户请求重定向到适当的控制器。例如 http://localhost/teams/nba,“teams”是控制器,“nba”是动作。

您必须创建一个 TeamController 并在控制器中创建一个“nba”动作。该模型正在处理 DB 层,因此使用 getNbaList 方法创建一个 Team模型来检索所有 NBA 球队。您必须在您的操作中调用模型,然后您可以将视图(主要是 html)提供给您从模型中获得的所有团队。

于 2013-01-23T09:07:48.220 回答
2

正如一些人已经提到的那样。MVC 不是一个框架。

MVC 是相当古老的设计模式,最初是为 smalltalk 定义的。多年来认为它已经有所发展并产生了几种相关的模式,这些模式已经适应在 Web 中使用。

MVC 的核心思想是关注点分离。这就是为什么 MVC 和所有受 MVC 启发的模式都由两层组成:

  • 表示层,处理所有形式的接口
  • 模型层,处理存储和业务逻辑。

由于这是两个不同的层,他们不应该知道其他人的内部结构。否则你最终会泄漏抽象。

表示层

在实现良好的 MVC 结构中,控制器仅更改模型层的状态(在极少数情况下 - 当前视图实例的状态)。控制器不负责模型层或其中任何结构的实例化。

MVC 中的视图实例应该负责产生对用户的响应。在某些情况下,它可能只需要发送一个 HTTP 位置标头,而在其他情况下 - 它通过组合多个模板生成 HTML 输出。从模型层查看它需要的请求数据。

在这种情况下,“用户”不是人,而是与网站通信的浏览器。

模型层

该层通常由三组主要结构组成:

  • 领域对象,处理特定业务实体的逻辑
  • 存储抽象(通常 -数据映射器),能够存储来自域对象的数据
  • services,包含应用程序逻辑(域对象和存储抽象之间的交互)

表示层通过服务与模型层交互。控制器向它们发送数据,这会改变模型层的状态,而视图实例则从它们那里请求数据。

如果您有兴趣,这里有更多关于模型层的解释

附言

避免使用 PHP 框架。它们中没有一个实际上实现了 MVC。相反,它们中的大多数都是纯 Rails 克隆,它本身从未打算成为生产阶段的框架(此处解释)。

于 2013-01-23T09:29:25.667 回答