【问题标题】:Help with understanding what goes in Controller vs. View in MVC帮助理解 MVC 中的 Controller 与 View 中的内容
【发布时间】:2011-05-30 13:45:14
【问题描述】:

我是 MVC 的新手,我正在通过 Codeigniter 框架进行自我介绍。作为一个练习应用程序,我正在创建一个简单的博客应用程序,它可以创建、查看、编辑和删除帖子。

对于“编辑帖子”页面,我使用与“创建新帖子”相同的视图文件,并在用户编辑旧帖子时使用从模型中获取的数据简单地填充表单字段.

这看起来一切都很好,但我对控制器与视图中存储的逻辑有点困惑。我显然需要一些逻辑来告诉表单预先填充表单字段(如果我正在编辑帖子)或将所有内容留空(如果它是新帖子)。还有其他一些事情,例如查看页面需要知道在页面顶部显示什么标题:“创建新帖子”或“编辑帖子”。

这个逻辑到哪里去了?它进入视图吗?或者它进入控制器?为什么?我开始将所有这些逻辑放在视图文件中,因为我已经读过我应该保持控制器代码最少,但是我现在在我的视图文件顶部有一个很大的 php 代码块,它正在处理变量,我不确定如果这是正确的方法。

任何建议将不胜感激!

【问题讨论】:

    标签: model-view-controller codeigniter view controller logic


    【解决方案1】:

    我显然需要一些逻辑来告诉表单预先填充表单字段(如果我正在编辑帖子)或将所有内容留空(如果它是新帖子)。

    查看Form Helper 中的 set_value() 函数。你可以在你的视图中做这样的事情:

    <input type="text" name="subject" value="<?php echo set_value('subject', $subject); ?>" size="50" />
    

    如果是新帖子,则在从控制器加载视图时将空字符串作为 $subject 传递。

    如果正在编辑,请将正在编辑的帖子的主题作为 $subject 传递。

    此外,如果用户提交表单并且出现错误并且您需要重新加载表单,set_value() 将返回用户刚刚发布的内容(即 $_POST['subject'])。

    还有其他一些事情,例如查看页面需要知道在页面顶部显示什么标题:“创建新帖子”或“编辑帖子”。

    只需将一个名为 $page_title 的变量从您的控制器传递到您的视图,并相应地设置值。这很常见,尤其是当您开始构建可重用模板时。

    这个逻辑到哪里去了?它进入视图吗?或者它进入控制器?为什么?

    视图中应该几乎没有逻辑。如果必须的话,可以使用简单的 if/else 语句,并循环遍历数据数组。

    即使是控制器也不应该有太多的逻辑。它主要负责充当模型、视图和库之间的中间人。

    我读到我应该尽量减少控制器代码

    这与控制器与模型有关,而不是视图。保持控制器更小,并将尽可能多的逻辑放入模型和库中是一种很好的做法。也称为“瘦控制器,胖模型”。

    【讨论】:

    • 感谢布拉克的详细回答。所以只是为了让我自己清楚,控制要在视图中填充的所有内容的逻辑(无论是新帖子还是正在编辑的现有帖子)将通过一些简单的东西(例如 if)存储在控制器中/else,繁重的工作将由模型完成,向控制器传递需要什么数据?
    • @justinl 是的,听起来不错。尝试将所有数据库交互保留在您的模型中。示例:通过 id 获取 Post 的内容。或获取最新帖子列表。
    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2015-03-27
    相关资源
    最近更新 更多