直接与模型层进行视图对话是不是一种糟糕的做法


Is it bad practice to have a view talk directly to the model layer?

我最近发现了用于PHP的优秀的redbean ORM库,这使得在我的web应用程序中执行CRUD操作变得微不足道,但我最近实现了一些我开始质疑的附加功能。为了更容易保存数据,我创建了一个名为redbean.php的过程性表单处理脚本。每当该脚本被指定为表单操作时,它都会根据提交给它的数据动态创建一个新的bean:

<?php Template::startContent(); ?>
<form action="forms/redbean.php" method="POST">
    <input type="hidden" name="bean" value="book"/>
    <input type="text" name="author"/>
    <input type="text" name="pubDate"/>
    <input type="submit" value="Save Bean!"/>
</form>
<?php Template::endContent(); ?>

我开始质疑这种方法的原因是,我的框架中的其他所有东西都使用MVC模式,但这感觉像是作弊,因为数据直接从视图进入ORM库。无论如何,我正在尝试使用PHP和web编程的最佳实践来实现这个应用程序,所以我的问题是,这种方法是否代表了我不知道的反模式,或者在这个实现中是否还有其他需要考虑的地方。

如果你真的试图坚持MVC模式,那么是的,你并没有通过在视图中随机调用脚本来向数据库添加数据来坚持真正的模式。MVC的目的之一是统一性。表单数据被传递给控制器,控制器调用模型对其进行验证和保存,然后将错误或成功调用返回到所显示的视图。根据您所描述的,您的脚本只是忽略了所有这些并创建了bean。

现在,考虑到您的脚本中确实有验证,当您对验证进行任何更改时,您必须在该脚本中反映它。简单是游戏的名称,在多个地方重复代码只是一种浪费。

如果您希望遵守MVC规则,只需将大量规则复制到您的模型中并在那里进行处理即可。它将允许您使用脚本并继续使用MVC。

不过,归根结底,这是你的剧本。如果它有效,它就有效。如果你正在使用生产材料或在团队中工作,我不会使用它。如果它是个人使用或仅用于你的个人网站,请使用它。

我认为您的方法很好——只需关注安全性和验证即可。RedBeanHP还使用Cooker促进了这种方法,它完全符合您的描述,但也增加了对关系的支持:http://www.redbeanphp.com/cooker

这有点可怕,因为它真的非常强大,你可以很容易地创建安全漏洞,但如果处理得当,你可以绕过粗糙的MVC模式,进行一些真正的高速开发。

不要太关注OOP、MVC和模式,它们通常非常有用,但人们往往会过度使用它们。此外,这些技术中的许多都是在另一个功能更好的领域开发的,它们已经从这个领域复制到了网络上,在那里它们。。。做得不错,但不太理想。例如,MVC来自桌面GUI,OOP来自Smalltalk等。虽然它们在PHP中仍然很有用,但你不应该太担心不使用它们right-因为它们已经导入到PHP域中,不再有right的方式。只要做任何有效的事。最重要的是,您(和您的同事)可以轻松地阅读和维护代码。仅此而已。