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

Php MVC模式:首先需要创建什么?,php,model-view-controller,codeigniter,testing,Php,Model View Controller,Codeigniter,Testing,我正在研究CodeIgniter及其软件模式。应该首先创建哪个,视图还是控制器?控制器,需要它在模型和视图之间进行通信。 没有控制器,模型无法与视图交互。您应该从控制器开始,因为它正在调用视图 在这里,您可以看到控制器处于模型和视图之间。 因为这是您的应用程序,所以模型是。控制器和视图仅构成模型的一个接口。可以说,控制器就是你家的门。你先造什么?门还是房子?好的,那么首先构建模型。然后向它添加一个接口。控制器是必须的。因为没有控制器,您无法执行/完成工作。所以控制器是第一位的,因为 必要时可以禁

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

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

您应该从控制器开始,因为它正在调用视图

在这里,您可以看到控制器处于模型和视图之间。
因为这是您的应用程序,所以模型是。控制器和视图仅构成模型的一个接口。可以说,控制器就是你家的门。你先造什么?门还是房子?好的,那么首先构建模型。然后向它添加一个接口。

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

  • 必要时可以禁用该视图
  • 您可以通过控制器为视图设置相关变量
  • 与模型的交互是由控制器完成的,因此当您需要数据时,控制器是第一位的
  • 您可以将用户重定向到其他控制器
  • 您可以根据请求显示其他视图。对于计算机视图A,对于移动设备视图B,如wise
  • 视图是演示文稿,因此首先需要显示数据

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

  • 使用CSS/图像等创建html模板
  • 根据视图上显示的数据,我创建控制器方法
  • 我将虚拟数据放在控制器方法中,以便可以看到一个正确操作视图的动态页面
  • 根据控制器需要的数据,我创建模型方法
  • 在这个过程中,我从不创建任何额外的方法或代码块。它阻止添加我们通常认为“可能必要”的代码。但它们从来都不需要


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

    我认为模型和控制器是手拉手的

    没有模型,您如何知道控制器中的流是什么

    没有控制器,您如何知道模型中需要哪些方法


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

    虽然这个问题已经有了公认的答案,但我想从可测试性的角度提供一种方法。现成的框架在设计控制器时往往没有考虑到可测试性,因此这类问题层出不穷

    编写良好的可测试控制器应将视图视为通过控制器的
    \u构造方法注入的依赖项。不过,我不知道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
    关键字的原因。您的控制器(以及任何其他对象)应该询问它的依赖项,而不是查找它们。这将带来更透明的API、更多可测试的代码、更少的调试麻烦和更愉快的心情。

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

    总的来说,我同意@Shiplu的观点,这个问题太广泛了。然而,我认为它实际上得到了一些肯定的答案,所以这一次很有用。我建议过路人查看一些不同的答案。不同答案的数量很有趣。所以我认为这是个好问题。我个人认为这很大程度上取决于项目的简单性和团队中的资源量。我认为很多单个开发人员会更快地从上到下工作,从ui到模型。在一些公司,规范将是线框或HTML。我怀疑有一个适合所有人的正确答案。+1这是一个完全有效的自上而下的方法。当前端逻辑规范或模型设计缺失/不被认为是有效的工作时,肯定可以很好地工作。这完全取决于环境和QA要求。对于许多应用程序来说,没有什么比自顶向下工作更容易或更快的了。+1在过去,当我们使用记事本预静态页面时,我们都使用设计优先的方法。在旧社会,这是完全有道理的,尽管它可能是非常复杂的