代码之家  ›  专栏  ›  技术社区  ›  dierre

MVC-消毒数据,在哪里?

  •  1
  • dierre  · 技术社区  · 14 年前

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

    4 回复  |  直到 14 年前
        1
  •  1
  •   Residuum    14 年前

    我不同意清理数据以存储在controller中,并且认为最好的地方是在model中,因为controller不应该知道数据是如何存储的,但是清理需要这些知识(例如。 mysql_real_escape_string() 用于存储mysql vs. pg_escape_string() 对于postgresql,或者检查有效的xml(如果存储在xml文件中),或者其他一些不同的存储机制)。

    为了防止像跨站点脚本之类的事情,在存储之前不要清理数据,因为稍后您可能会对某些HTML标记有一些合法的使用,并且在视图或控制器中(理想情况下)这样做。

        2
  •  2
  •   Sarfraz    14 年前

    您应该清理客户端视图上的数据和服务器端控制器上的数据。

        3
  •  2
  •   JMTyler aMarCruz    14 年前

    严格地说,我会这么说, 消毒 您的数据应该出现在控制器中,但清理通常也指清理用户输入以避免许多问题,例如sql注入。因为您在不同的上下文中使用“sanitize”一词,所以我们必须更加注意上下文是什么。

    你没有清理用户输入,这意味着它实际上不需要在控制器中发生。根据要保存的项是否已存在于数据库中,您正在更改此操作的结果。因此,在我看来,它应该发生在模型中(或者,正如munkiphd所指定的,在某种类型的helper类中有一个可以从任何地方调用的方法——但我说在模型中调用它)。

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

        4
  •  1
  •   MunkiPhD    14 年前

    不过,您可能希望从控制器中清理它,但“from”并不意味着“in”,需要一个单独的类来清理数据,这样您就可以从任何需要的地方调用该类。

    您基本上想要创建一个契约,您的模型将一直收到良好的数据,这意味着您必须事先清理它。