我试图理解模型上的“胖”与控制器上的“瘦”的概念,根据我一直在讨论的内容,我有以下示例(取自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'); } }
因为这就是控制器需要知道的全部。它不应该更新行。它应该只告诉模型有人请求了此更改。更新是类管理行的责任。同样,控制器不一定必须清除该值。