让视图直接与模型层对话是不好的做法吗?

时间:2013-08-21 01:29:27

标签: php design-patterns redbean

我最近发现了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编程的最佳实践来实现这个应用程序,所以我的问题是这种方法是否代表了我不知道的反模式,或者是否还有其他任何我应该考虑这个实现。

2 个答案:

答案 0 :(得分:2)

如果您真的想要坚持MVC模式,那么是的,您不会通过在视图中随机调用脚本来将数据添加到数据库来附加到真实模式。 MVC的目的之一是一致性。您的表单数据将传递给控制器​​,控制器调用模型以对其进行验证并保存,然后将错误或成功调用返回到显示的视图。根据您所描述的内容,您的脚本会忽略所有这些并创建bean。

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

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

最终,它是你的脚本。如果它工作,它的工作原理。如果您正在使用生产材料或团队,我不会使用它。如果是个人用途或仅用于您的个人网站,请选择它。

答案 1 :(得分:0)

我认为您的方法很好 - 只需关注安全性和验证。 RedBeanPHP也使用Cooker来促进这种方法,它完全按照你描述的方式进行,但也增加了对关系的支持:http://www.redbeanphp.com/cooker

它有点可怕,因为它真的非常强大,您可以轻松创建安全漏洞,但如果处理得当,您可以绕过苛刻的MVC模式并进行一些非常高速的开发。

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