MVC模式:首先需要创建什么


MVC pattern: what needs to be created first?

我正在研究CodeIgniter及其软件模式。应该首先创建哪个,视图还是控制器?

模型,因为这是您的应用程序。控制器和视图仅形成模型的一个接口。有人可能会说,控制器就是你家的门。你首先建造什么?门还是房子?好的,所以先构建模型。然后添加一个接口。

我总是从View开始。场景是,我已经设计了我的数据库,选择了技术。这是我在MVC模式上的工作流程。

  1. 使用CSS/image等创建html模板
  2. 根据视图中显示的数据,我创建Controller方法
  3. 我在控制器方法中放入了伪数据,这样我就可以看到一个正确操作视图的动态页面
  4. 根据我的控制器需要的数据,我创建了Model方法

在这个过程中,我从不创建任何额外的方法或代码块。它防止添加我们通常认为"可能是必要的"的代码。但它们从来都不需要。

通过这种方式,您首先创建规范,然后在每个步骤上实现它。因此,View为它创建数据需求。Controller提供它。并为Model创建数据规范。最后,模型只提供那些被调用或需要的数据。

控制器是必须的。因为如果没有控制器,你就无法执行/完成工作。所以控制器是第一位的,因为以下,

  1. 必要时可以禁用视图
  2. 您可以通过控制器为视图设置相关变量
  3. 与模型的交互是由控制器完成的,因此当您需要数据时,控制器会优先考虑
  4. 您可以将用户重定向到其他控制器
  5. 您可以根据请求显示其他视图。对于计算机视图A,对于移动设备视图B,如wise
  6. 视图就是演示,所以首先需要数据来演示

虽然这个问题已经有了公认的答案,但我想从可测试性的角度提供一种方法。现成的框架通常在设计控制器时没有考虑到可测试性,所以这类问题会反复出现。

一个编写良好、可测试的控制器应该将该视图视为通过控制器的__construct方法注入的依赖项。不过,我不知道CodeIgniter控制器是否允许此功能。

在MVC范式中,控制器将视图和模型的元素"结合在一起",因此,与任何行为依赖项一样,如果这些对象提供了"愚蠢"数据存储之外的任何功能,则应在实例化时将它们注入控制器,以便对其进行模拟以进行测试。因此,您可以执行以下操作:

$view  = new SmartyView;
$model = new UserModel;
$controller = new LoginController($view, $model);

通常,该模型不提供任何公共的"行为"方法,而是充当基本的数据存储实体。如果是这种情况,出于同样的原因,您不需要将阵列数据结构注入控制器来创建新的阵列,您可以在控制器内安全地创建新的模型实例,而不会牺牲可测试性:

class LoginController
{
  protected $view;
  public function __construct(ViewInterface $view)
  {
    $this->view = $view;
  }
  public function doLogin($user, $pass)
  {
    $userModel = new UserModel();
    // do stuff with model to determine if user/pass was valid
  }
}
$view  = new SmartyView;
$controller = new LoginController($view);

对于可测试性,最佳实践是避免将控制器与视图和模型紧密耦合。这就是为什么您通常应该避免在控制器代码中使用new关键字。您的控制器——以及任何其他对象——应该ASK对其依赖项,而不是LOOK。这将带来更透明的API、更可测试的代码、更少的调试麻烦和更快乐的生活。

我知道这可能是个老问题,但我现在遇到了
以后其他人可能需要它。所以我决定总结一下。
我认为你的方法将取决于情况
让您进行的操作顺序是模型视图控制器
并称之为自下而上方法。这方面的案例和理由由@Gordon在这里提供
当您开始使用UI时,另一种情况让我们称之为自上而下。案例和理由由@shiplu.mokadd.im提供
评估您自己的案例并从中选择一个。祝你好运

控制器,您需要它在模型和视图之间进行通信。如果没有控制器,模型就无法与视图交互。

您应该从Controller开始,因为它正在调用View。

在这里,您可以看到Controller位于Model和View之间。http://codeigniter.com/user_guide/overview/mvc.html

我会说模型和控制器手牵手。

如果没有模型,你怎么知道控制器中的流量是多少?

如果没有控制器,你怎么知道模型中需要什么方法?

有时,模型会获得优先级,有时控制器会根据情况而定。