2

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

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

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

4

5 回答 5

5

我会争辩说,正如您所说,自引用页面没有遵循适当的关注点分离。你在同一个页面上做两件不同的事情,更清晰的逻辑分离会让你在两个不同的页面上做这些事情。

MVC(模型视图控制器, http ://en.wikipedia.org/wiki/Model-view-controller)框架强调了这种做法,例如 Ruby on Rails、Django 和 ASP.NET MVC(我不知道)我不知道任何 PHP 的,尽管我确信有一些)。

这也是 RESTful (REpresentational State Transfer) 实践的一个基本特征,其中每个 URL 代表一个资源和要对该资源执行的单个操作。另一方面,自引用页面的每个 URL/页面将有“2”个操作,例如“新建”(用于填写表单)和“创建”(实际创建对象)。

为网站实践 MVC 和 RESTful ( http://en.wikipedia.org/wiki/RESTful ) 实践通常会产生更简洁的代码和更好的关注点分离。这很重要的原因是它使测试更容易(我所说的测试是指单元和功能测试,而不是“在我的浏览器上尝试页面”测试)。

统计数据的混乱是一个例子,说明不分离你的关注点会导致意想不到的复杂性。有些人可能会通过尝试检测请求的引用者来解决此问题,并查看它是否是同一页面。这些实际上只是解决症状的代码绷带,而不是解决问题。如果您在网站的不同页面中保留不同的“操作”,您可以将这些页面集中在他们的一项工作上,并确保他们做得很好,而不是用各种条件和额外的复杂性来混乱代码,如果完全避免的话1 页只有 1 个作业。

于 2008-09-24T19:25:42.623 回答
1

表单处理的单一文件方法背后的最有力论据是它更容易维护。

请允许我扮演魔鬼的拥护者:如果您最初的两个文件方法有效且可衡量,为什么要更改它——特别是如果更改它会迫使您想出解决方法来衡量表单提交?

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

于 2008-09-24T19:33:32.790 回答
1

在我要求某人填写表格(由文件中的脚本生成)的情况下,我喜欢回发到同一个脚本,以便我可以将错误检查放在顶部,然后重新生成如果发现任何错误,请填写表格。这使我可以编写一次表单生成并重新使用它,直到输入可以接受(即“请更正以红色显示的字段”等)。

一旦输入通过了所有健全性检查,您就可以从同一个脚本发出结果页面,或者调用另一个脚本,这取决于哪个更适合您的情况。但我个人认为您描述的自引用脚本没有问题。

That said, I always call on generic code and libraries to do the form generation and error checking, so even this "shared" form generation code ends up being fairly compact and simple.

于 2008-09-24T19:35:30.040 回答
0

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

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

这将允许您在将代码维护在同一文件中的同时跟踪请求。

于 2008-09-24T19:18:05.853 回答
0

您可以使用单独的页面,并且只让结果页面包含表单页面。

于 2008-09-24T19:20:04.010 回答