一尘不染

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

php

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

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

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

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

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

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

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

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

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

感谢您的关注


阅读 487

收藏
2020-05-29

共1个答案

一尘不染

您的应用程序是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');
    }
}

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

2020-05-29