当前位置: 首页 > 面试题库 >

了解MVC:模型上的“胖”概念,控制器上的“瘦”概念是什么?

欧盛
2023-03-14
问题内容

我试图理解模型上的“胖”与控制器上的“瘦”的概念,根据我一直在讨论的内容,我有以下示例(取自freenode的讨论):

问:在MVC范例中,其所说的Fat模型是瘦控制器。我在这里思考的是,如果我有很多方法(在控制器上)仅对CRUD使用了一些抽象方法(在模型上),那么我是在创建胖控制器而不是模型吗?还是他们说,胖模子,退回了什么却没有输入?这是我从未理解过的东西=)任何评论表示赞赏!非常感谢

OBS1:我没有执行模型的操作,在控制器中,我只有控制模型操作的方法

OBS2:假设“ checkIfEmailExists()”具有“
john@hotmail.com”作为参数。该方法将从查询该参数是否存在于表中的模型方法的返回值中返回boolean。如果为0,则“
checkIFemailExists()”将调用一个不同的模型方法,该方法只是另一个执行Update操作的抽象方法。

OBS3:“
checkIfEmailExists()”,不仅仅是控制器吗?他实际上并没有执行任何CRUD,只是在比较值等。这让我感到困惑,因为在我看来,这是一个控制器:S

注意:我猜这不是最好的例子,因为说“检查是否存在”,听起来像是查询我的表操作

Q2:还有一个问题,所以,我有一个查看表单,从该表单发送电子邮件地址参数。您是说视图直接进入模型吗?

Q3:控制器在它们之间不应该动作吗?多数民众赞成在范式

最后说明:讨论结束,说我错了,希望还可以(我正在学习)。但是,第二和第三季度的正确答案是什么?

感谢您的关注


问题答案:

您的应用程序是M。它应该能够独立于V和C。V和C构成您应用程序的用户界面。对于应用程序的核心业务逻辑而言,这是Web界面还是命令行界面都无关紧要。您希望模型具有业务逻辑。

如果您有一个胖控制器,例如充满业务逻辑,那么您就不会遵循MVC的目的。控制器的唯一责任是处理UI请求并将其委托给模型。这就是为什么它应该很瘦。它只应包含其负责的必要代码。

简化示例

public function fooAction()
{
    if(isset($_POST['bar'])) {
        $bar = Sanitizer::sanitize($_POST['bar']);
        $rows = $this->database->query('SELECT * from table');
        try {
            foreach($rows as $row) {
                $row->foo = $bar;
                $row->save();
            }
        } catch (Exception $e) {
            $this->render('errorPage');
            exit;
        }
        $this->render('successPage');
    } else {
        $this->render('fooPage');
    }
}

什么时候应该

public function fooAction()
{
    if(isset($_POST['bar'])) {
        $success = $this->tableGateway->updateFoo($_GET['bar']);
        $page    = $success ? 'successPage' : 'errorPage';
        $this->render($page);
    } else {
        $this->render('fooPage');
    }
}

因为这就是控制器需要知道的全部。它不应该更新行。它应该只告诉模型有人请求了此更改。更新是类管理行的责任。同样,控制器不一定必须清除该值。



 类似资料:
  • 问题内容: 这是一个通用的体系结构问题。我在许多地方读到,在MVC框架中,(1)模型应该很胖,而控制器应该很瘦。但是我也读到(2)细节取决于您正在开发的框架。因此,如果您正在使用django开发,该怎么办? 我在django中的经验是,很多逻辑最终都被放入视图和表单中。不是“业务逻辑”,而是处理请求,会话等的细节。就代码行而言,这些细节通常超过处理模型对象的业务逻辑。我是在做错什么,还是这是Dja

  • Access control concepts (访问控制的概念) Loopback 的 访问控制系统是围绕几个核心概念. Term(控制项目) Description(描述) Responsibility(职能) Example(举例) Principal(主要) 一个可以被识别或验证的个体 代表一个需要请求受保护资源的个体 User 用户 Application 应用 Role 角色(Role

  • 关系模型可以表示为包含列和行的表,每一行都称为元组。 列的每个表都有一个名称或属性。 域 - 包含属性可以采用的一组原子值。 属性 - 包含特定表中列的名称。每个属性必须有一个域。 关系实例 - 在关系数据库系统中,关系实例由一组有限的元组表示。关系实例没有重复的元组。 关系模式 - 关系模式包含所有列或属性的关系名称和名称。 关系键 - 在关系键中,每行都有一个或多个属性。它可以唯一地标识关系中

  • 主要内容:1. 实体,2. 属性,3.关系ER模型代表实体-关系模型。 它是一种高级数据模型。 此模型用于定义指定系统的数据元素和关系。它为数据库开发了概念设计。它还开发了一种非常简单易用的数据视图。 在ER建模中,数据库结构被描绘为称为实体关系图。 例如,假设要设计一个学校数据库。 在该数据库中,学生(student)将是具有地址,姓名,身份,年龄等属性的实体。地址(address)可以是具有诸如城市,街道名称,密码等属性的另一实体,并

  • Navicat Data Modeler 让你创建概念模型,包括实体和关系。 若要创建一个概念模型,从菜单栏选择“文件”->“新建”。在“新建模型”窗口中,选择“模型类型”为“概念”。 你也可以使用下列的功能来创建一个概念模型: 从数据库导入 - 从现有的数据库/模式或 ODBC 数据源逆向工程。 模型转换 - 从一个物理或逻辑模型转换。

  • Navicat Data Modeler 让你创建概念模型,包括实体和关系。 若要创建一个概念模型,从菜单栏选择“文件”->“新建模型”。在“新建模型”窗口中,选择“模型类型”为“概念”。 你也可以使用下列的功能来创建一个概念模型: 从数据库导入 - 从现有的数据库/模式或 ODBC 数据源逆向工程。 模型转换 - 从一个物理或逻辑模型转换。