最佳实践:网站上的自引用脚本

时间:2020-03-06 14:40:59  来源:igfitidea点击:

在经验丰富的开发人员的建议下,我始终将需要用户输入(表单处理,数据库管理等)的网页编码为自引用页面。对于PHP页面,我将表单的操作设置为$ _SERVER预定义变量的`PHP_SELF'元素,然后根据我传递的参数,页面逻辑确定要执行的代码块。

我喜欢所有代码都包含在一个文件中,而不是散布到各种结果页中。我发现的一个问题是我的统计信息解析程序无法区分页面的第一个视图和后续视图(例如,提交表单时)。很久以前,当我使用CGI或者CF创建页面时,我将用户定向到另一个结果页面,该页面非常整洁地显示了实际使用该表单的次数。

Web开发中此类页面的最佳实践是什么?使用(或者不使用)自引用页面还有其他更令人信服的理由吗?

解决方案

一种可能的选择是设置指向相同URL的mod_rewrite别名。例如:

RewriteEngine on
RewriteRule ^form$ form.php [QSA]
RewriteRule ^form/submit$ form.php [QSA]

这样一来,我们就可以在将代码保存在同一文件中的同时跟踪请求。

我们可以使用单独的页面,而结果页面仅包含表单页面。

我要说的是,正如我们所说的那样,自我引用的页面并没有遵循适当的关注点分离。我们在同一页面上执行2种不同的操作,如果逻辑上更清晰地分开,则可以在2个不同的页面中进行处理。

MVC(model-view-controller,http://en.wikipedia.org/wiki/Model-view-controller)框架(例如Ruby on Rails,Django和ASP.NET MVC)强调了这种做法。我不知道有什么PHP的想法,尽管我确定有一些)。

这也是RESTful(表示状态转移)实践的一项基本功能,其中每个URL代表一个资源,并使用该资源执行单个操作。另一方面,自引用页面的每个URL /页面将具有" 2"个操作,例如"新建"(用于填写表单)和"创建"(用于实际创建对象)。

为网站采用MVC和RESTful(http://en.wikipedia.org/wiki/RESTful)做法通常可以使代码更简洁,并可以更好地分离问题。之所以如此重要,是因为它使测试变得更加容易(通过测试,我指的是单元和功能测试,而不是"在浏览器上尝试页面"测试)。

统计数据混乱不堪是一个例子,说明如何不分开关注点会导致意想不到的复杂性。某些人可能通过尝试检测请求的引荐来源并查看它是否在同一页面来解决此问题。这些实际上只是解决问题的代码绷带,而不是解决问题。如果我们在网站的不同页面上保留不同的"操作",则可以将这些页面集中在其一项工作上,并确保它们做得很好,而不是使用各种条件和其他复杂性来使代码混乱, 1页只有1个作业。

用于表单处理的单个文件方法背后最有力的论据是,它更易于维护。

请允许我扮演魔鬼的拥护者:如果我们原来的两个文件的方法可行并且可衡量,为什么要对其进行更改-特别是如果更改它会迫使我们提出解决方法以测量表单提交?

另一方面,如果我们要处理的事情比我想象的简单,例如,简单的联系表单提交,那么我们可能应该学习如何记录操作而不是依赖于网络统计数据包。