2010-03-29 67 views
1

我使用CakePHP,但它是关于MVC模式的问题。我的表单中有标签的输入文本(用逗号分隔)。为了添加标签,我创建了一个标签模型方法,基本上检查标签是否存在,然后在标签计数器中添加新标签或新单元(标签模型包含以下字段:id,name,slug,count) 。 在控制器中,我会分解标签字段并一次传递一个标签。 问题是:我在哪里清理数据?在控制器或模型方法中?我认为它应该在控制器中,因为这是我爆炸的地方,但就可重用性而言,我认为我应该在模型中清理数据。 你觉得呢?MVC - 清理数据,在哪里?

回答

1

我不同意将控制器中的数据进行消毒处理,并认为最好的地方是在模型中进行,因为控制器不应该知道数据如何存储,但消毒需要知识(例如,mysql_real_escape_string()用于存储MySql与PostgreSQL的pg_escape_string()相比,或者可能检查存储在XML文件中的有效XML,或者用于不同存储机制的其他内容)。

为了防止跨站点脚本之类的事情发生,请勿在存储之前对数据进行清理,因为稍后您可能会对某些html标记进行一些合法使用,并且(理想情况下)在视图中或控制器中执行此操作。

+0

所以你基本上建议所有都取决于我正在消毒的东西,对吧?在我的情况下,我的标签是严格字母数字和每次我必须创建slu((我使用slu检查标签的存在)。所以我想我会在控制器中清除html中的数据,然后检查SQL注入以及在模型中创建slug。这可以吗? – dierre 2010-03-29 14:53:48

1

你想从你的控制器中清理它,但是“from”并不意味着“in”。让一个单独的课程清理数据 - 这样您就可以从任何需要的地方调用该课程。

您基本上想要创建合同,您的模型将始终收到良好的数据,这意味着您必须事先对其进行消毒。

+0

那么CakePHP有一个Sanitize类,我正在使用它。我只是在想我在哪里使用它。 当然,我会清理beforhand,事实上我的自定义方法中,我发现消毒后发生了save/update方法。 – dierre 2010-03-29 14:49:01

2

您应该在客户端的View和服务器端的Controller上清理数据。

2

严格来讲,我会说,你的数据应该发生在控制器中,但一般来说,清理用户输入也是为了避免很多问题,比如SQL注入。由于您在不同的环境中使用“消毒”一词,因此我们必须更多关注这种情况。

你并没有清理用户输入,这意味着它并不是真的需要在控制器中发生。您将根据您保存的项目是否已存在于数据库中来更改此操作的结果。因此,在我看来,它应该发生在模型中(或者,像MunkiPhD指定的那样,在某种助手类中有一种方法,您可以从任何地方调用 - 但我称之为模型中的方法)。

编辑:通常,在MVC中,模型知道是否应该将新行保存到数据库中,或根据模型实例是否具有有效的ID来更新现有的行。如果它有一个ID,模型应该保存到由该ID索引的行。如果没有,模型会创建一个新模型。我的理解是,你想要做的就是知道在哪里做出决定是创建一个新的还是更新现有的一个,并且这在模型中发生。

+0

是的,我更新的区别在于我必须在计数器中添加一个单位,这不是cakephp模型中的默认行为,但这不是一个真正的问题。 – dierre 2010-03-29 14:55:34

+0

你不能扩展模型并告诉框架使用你的子类吗? – JMTyler 2010-03-29 23:28:25