【问题标题】:MVC pattern: what needs to be created first?MVC 模式:首先需要创建什么?
【发布时间】:2012-03-04 05:32:48
【问题描述】:

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

【问题讨论】:

  • 总的来说,我同意@Shiplu 的观点,即这个问题太宽泛了。但是,我认为它实际上产生了一些积极的答案,所以它只有这一次有用。我建议路人查看提供的一些不同答案。
  • 不同答案的数量很有趣。所以我认为这是个好问题。我个人认为这在很大程度上取决于项目的简单性和团队中的资源量。我认为很多单身开发人员会更快地从上到下工作,从 ui 到模型。在一些公司中,规范将是线框或 HTML。我怀疑有一个万能的正确答案。

标签: php model-view-controller codeigniter testing


【解决方案1】:

我知道这可能是个老问题,但我现在碰到了它。
以后可能会有其他人需要它。所以我决定总结一下。
我认为您的方法将取决于具体情况。
让您的操作顺序如下 Model-View-Controller
我们称之为 自下而上的方法。对此的案例和推理由@Gordon here 提供。
当您从 UI 开始时,我们将其称为 Top-To-Bottom。案例和推理由@shiplu.mokadd.im here 提供。
评估您自己的案例并选择其中之一。祝你好运!

【讨论】:

    【解决方案2】:

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

    编写良好的可测试控制器应将视图视为通过控制器的__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 关键字的原因。你的控制器——以及任何其他对象——应该询问它的依赖关系,而不是LOOK。这将导致更透明的 API、更可测试的代码、更少的调试麻烦和更快乐的你。

    【讨论】:

    • 这部分让我有点困惑。在请求生命周期中,您最终将如何向控件提供相关信息?一般来说,路由器/调度程序执行一个非常简单的调用,例如$route->set('/uri/to/match', 'ControllerName', 'controllerAction'); 你所描述的是在一个大项目中编写代码会非常乏味,这涉及将一些匿名函数应用于路由器/调度程序,然后处理在将它们传递给控制器​​之前进行实例化。如果一个模型依赖于其他模型怎么办?
    【解决方案3】:

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

    1. 使用 CSS/图像等创建 html 模板。
    2. 根据视图上显示的数据,我创建控制器方法。
    3. 我将虚拟数据放入控制器方法中,以便我可以看到正确操作视图的动态页面。
    4. 根据我的控制器需要的数据创建模型方法。

    在这个过程中,我从不创建任何额外的方法或代码块。它可以防止添加我们通常认为“可能需要”的代码。但它们永远不需要。

    通过这种方式,您首先创建规范,然后在每个步骤中实施它。就像,View 为它创建数据需求。控制器提供它。并为模型创建数据规范。最后 Model 只提供那些被调用或需要的数据。

    【讨论】:

    • +1 这是一种完全有效的自上而下的方法。当缺少前期逻辑规范或模型设计/不被认为是有效的努力时,肯定会很好地工作。这一切都取决于环境和质量保证要求。对于许多应用程序来说,没有什么比自上而下工作更容易或更快了。
    • +1 在过去,当我们使用记事本准备静态页面时,我们都使用设计优先。在过去,它非常有意义,尽管它可能在很大程度上基于个人选择。我相信如果你自己开发一个项目,这是非常有意义的。
    【解决方案4】:

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

    没有模型,你怎么知道控制器中的流程是什么?

    没有控制器,你怎么知道模型中需要哪些方法?

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        模型,因为那是您的应用程序。 Controller 和 View 只形成了 Model 的一个接口。可以说,控制器是你家的门。你先建什么?门还是房子?对,所以先建立模型。然后给它添加一个接口。

        【讨论】:

        • +1 这就是我们“通常”的工作方式,我认为它会导致更好的开发模型/api,并有助于 TDD。有时我们会打破流程并自上而下地工作,通常是当我们的需求定义不明确或利益相关者过度参与和演示时。它还允许在多个开发人员/设计人员之间更轻松地分离积压工作,即后端/用户界面。
        【解决方案7】:

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

        在这里你可以看到Controller是Model和View的中间。 http://codeigniter.com/user_guide/overview/mvc.html

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 2019-08-19
            • 1970-01-01
            • 2018-01-02
            • 1970-01-01
            • 2019-09-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多