我正在使用CakePHP,但这是关于MVC模式的问题。我在表单中有标签的输入文本(用逗号分隔)。要添加标签,我创建了一个标签模型方法,基本上检查标签是否存在,然后在标签计数器中添加新标签或新单元(标签模型包含以下字段:id,name,slug,count) 。 在控制器中,我爆炸标签字段并一次传递一个标签。 问题是:我在哪里清理数据?在控制器或模型方法?我认为它应该在控制器中,因为那是我爆炸的地方,但就可重用性而言,我认为我应该清理模型中的数据。 你觉得怎么样?
答案 0 :(得分:2)
您应该在View for client端和Controller for the server端清理数据。
答案 1 :(得分:2)
我会说,严格来说,清理您的数据应该发生在控制器中,但清理通常也是指清理用户输入以避免许多问题,例如SQL注入。由于您在不同的环境中使用术语“清理”,我们必须更加关注该环境。
您没有清理用户输入,这意味着它不需要在控制器中发生。您正在更改此操作的结果,具体取决于您要保存的项目是否已存在于数据库中。因此,在我看来,它应该发生在模型中(或者,正如MunkiPhD指定的那样,在某种辅助类中有一个方法可以从任何地方调用 - 但我说在模型中调用它。)
编辑:通常,在MVC中,模型知道是否应该将新行保存到数据库中,或者根据模型实例是否具有有效ID来更新现有行。如果它有ID,则模型应保存到该ID索引的行。如果没有,模型将创建一个新模型。我的理解是,您要做的就是知道在哪里决定是创建新的还是更新现有的,这种情况会发生在模型中。
答案 2 :(得分:1)
你想要从你的控制器中消毒它,但是,“来自”并不意味着“进入”。让一个单独的类清理数据 - 这样你就可以从任何你需要的地方调用该类。
您基本上想要创建合约,您的模型将始终获得良好的数据,这意味着您必须事先对其进行消毒。
答案 3 :(得分:1)
我不同意清理控制器中存储的数据,并认为最好的地方是在模型中执行,因为控制器不应该知道数据是如何存储的,但是清理需要知识(例如mysql_real_escape_string()
为PostgresQL存储MySql与pg_escape_string()
,或者如果存储在XML文件中,则可能检查有效的XML,或者为不同的存储机制存储其他内容。)
为防止跨站点脚本等问题,请不要在存储之前清理数据,因为稍后您可能会对某些html标记进行合法使用,并在视图或控制器中执行此操作(理想情况下)。