根据经验丰富的开发人员的建议,我总是将需要用户输入(表单处理,数据库管理等)的网页编码为自引用页面。对于PHP页面,我将表单的操作设置为'PHP_SELF'
预定义变量的$_SERVER
元素,并且根据我传递的参数,页面逻辑确定要执行的代码块。
我喜欢所有代码都包含在一个文件中,而不是传播到各种结果页面。我发现的一个问题是我的统计数据解析程序无法区分页面的第一个视图和后续视图(例如,表单已提交时)。很久以前,当我使用CGI或CF创建页面时,我将用户引导到一个不同的结果页面,该页面非常巧妙地显示了实际使用该表单的次数。
Web开发中这些类型页面的最佳实践是什么?使用(或不使用)自引用页面还有其他更有说服力的理由吗?
答案 0 :(得分:5)
我认为,如你所说的那样,自我引用的页面并没有遵循适当的关注点分离。你在同一个页面上做了两件不同的事情,在这两个不同的页面中你可以更清晰地分离逻辑。
MVC(模型 - 视图 - 控制器,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页只有1份工作。
答案 1 :(得分:1)
表单处理的单文件方法背后最有力的论据是它更容易维护。
请允许我扮演魔鬼的拥护者:如果你原来的两个文件方法有效并且可以衡量,为什么要改变它 - 特别是如果改变它会强迫你提出变通方法来衡量表单提交?
另一方面,如果您处理的事情比我想象的更简单,例如提交简单的联系表单,那么您可能需要learn how to log your actions而不是依赖于网络统计数据包。
答案 2 :(得分:1)
如果我要求某人填写表单(由文件中的脚本生成),我喜欢回发到同一个脚本,以便我可以将错误检查放在顶部,然后重新 - 如果发现任何错误,生成表单。这允许我编写表单生成一次并重新使用它直到输入可接受(即“请校正红色显示的字段”等)。
一旦输入通过了所有健全性检查,您就可以从同一个脚本发出结果页面,或者调用另一个脚本,具体取决于哪种情况更清晰。但我个人认为您描述的自引用脚本没有问题。
也就是说,我总是调用通用代码和库来进行表单生成和错误检查,所以即使这个“共享”表单生成代码也会变得相当紧凑和简单。
答案 3 :(得分:0)
一个可能的选择是设置指向同一URL的mod_rewrite别名。例如:
RewriteEngine on
RewriteRule ^form$ form.php [QSA]
RewriteRule ^form/submit$ form.php [QSA]
这将允许您在将代码保存在同一文件中的同时跟踪请求。
答案 4 :(得分:0)
您可以使用单独的页面,只需让结果页面包含表单页面。