2010-11-03 131 views
13

我正在接管现有的PHP项目。我注意到前面的开发人员为整个网站使用了一个index.php页面,目前有10多页。这是我见过的第二个项目。我没有看到这种方法的优势。事实上,它看起来像是让所有事情变得复杂,因为现在你不能只在网站上添加一个新页面并链接到它。您还必须确保使用if子句更新主索引页以检查该页类型,然后加载该页。看起来,如果他们只是试图重用模板,那么只需使用包含页眉和页脚的内容,然后使用引用的那些文件创建每个新页面就会更容易。为什么整个网站使用单个index.php页面?

有人可以解释为什么会使用这种方法吗?这是我不熟悉的MVC模式的某种形式吗? PHP是第二语言,所以我不太熟悉最佳实践。

我曾尝试在谷歌搜索“单一索引页与PHP”和类似的东西,但我找不到任何好的文章解释为什么使用这种方法。我真的很想把这些旧东西踢到路边,而不是继续沿着这条路走下去,但我想在提出建议之前有一些合理的推理。

+0

类似于http://stackoverflow.com/questions/604046/having-a-single-entry-point-to-a-website-bad-good-non-issue – zerkms 2010-11-03 04:22:05

+0

@zerkms感谢您指向类似文章。我在最难的时候找到了我想找的东西。我会看看它。 – spinon 2010-11-03 04:27:31

+0

'php前端控制器'可能会带来更多结果。在我看来,友好的链接是主要原因 – 2010-11-03 06:10:25

回答

16

前端控制器(index.php)可确保整个站点(如身份验证)的所有内容始终得到正确处理,无论您请求哪个页面。如果你有五十个不同的PHP文件分散在各处,很难管理它。而如果你决定改变公用库文件的加载顺序呢?如果你只有一个文件,你可以在一个地方改变它。如果您有50个不同的入口点,则需要更改所有这些入口点。

有人可能会说,一直加载所有常见的东西是浪费资源,你应该只加载这个特定页面所需的文件。真正。但是今天的PHP框架大量使用OOP和自动加载,所以这种“浪费”不再存在。

一个前端控制器也让你在你的网站中拥有漂亮的URL变得非常容易,因为你完全可以自由地使用你想要的任何URL,并将它发送到你需要的任何控制器/方法。否则,你会遇到以.php结尾的每个URL,然后是一个丑陋的查询字符串列表,而要避免这种情况的唯一方法就是在.htaccess文件中使用更加丑陋的重写规则。即使WordPress有几十个不同的入口点(特别是在管理部分),也会迫使最常见的请求通过index.php,以便您可以拥有灵活的永久链接格式。

几乎所有其他语言的Web框架都使用单一入口点 - 或者更确切地说,调用一个脚本来引导一个进程,然后与Web服务器进行通信。 Django就是这样工作的。 CherryPy就是这样工作的。在Python中这样做是很自然的。 PHP是唯一广泛使用的允许以其他方式编写Web应用程序的语言(除了用作旧式CGI脚本时)。在PHP中,你可以给任何文件一个.php扩展名,它将由Web服务器执行。这非常强大,它使PHP易于学习。但是,一旦你经历了一定程度的复杂性,单点入场方法开始看起来更具吸引力。

+0

感谢您的深入解答。我可以看到这方面的一些价值,我想这可能只是更多的在这里完成的实施,这正在扰乱我。 – spinon 2010-11-03 05:26:33

-1

通常当页面内容由数据库内容决定时,使用这种方法。因此,所有的工作都将在一个文件中完成。这在CMS系统中经常见到。

+0

是的,我可以看到。但是这些全部都有独立的内容页面,它们在索引页面中加载了一个if子句。只是看不到一个页面重定向所有请求的价值。我的意思是它重用了一个模板,但可以轻松地通过include来完成。 – spinon 2010-11-03 04:29:27

0

好吧,如果这唯一改变的是URL,它似乎并不像它的除了美观的目的任何理由做...

+0

不知道我关注。每个页面都有更改,因为每个页面都有一个正在创建的php页面。它只是被加载到索引页面,所以URL保持不变,只是参数改变。 – spinon 2010-11-03 04:30:24

+0

意思是“美观的”mysite.com/?page = about“vs mysite.com/about.php” – JustcallmeDrago 2010-11-03 04:33:09

0

至于我 - 单一入口点可以帮助你有更好的控制应用程序:它有助于轻松处理错误,路由请求,调试应用程序。

+0

为什么要通过单个文件路由请求? Web服务器已经将请求路由到单个页面。错误通常由包含内容的单个php页面处理。只是没有真正看到这里的大价值。 – spinon 2010-11-03 04:32:12

+0

@spinon:这对我来说至少是重要的;-)这就是我喜欢根据我7年以上的经验开发应用程序的原因;-) – zerkms 2010-11-03 04:35:32

+0

@spinon:让我们假设在页面生成过程中数据库崩溃了。所以你会在你分离的页面中间出现异常。你会在哪里发现这个异常? ;-) – zerkms 2010-11-03 04:36:19

0

单个“index.php”是一种简单的方法,可以确保对应用程序的所有请求都通过同一个门。通过这种方式,当您添加第二个页面时,您不必确保引导,认证,授权,日志记录等全部配置完成 - 您可以免费获得该框架的优点。

在现代Web框架中,这可能是使用前端控制器,但由于许多PHP代码/开发人员患有NIH综合征,因此无法判断。

+0

但不能你也只是将所有这些放入一个包含文件,然后具有相同的功能。但这是一个自定义的实现,而不是一个框架。 – spinon 2010-11-03 04:35:44

+0

是的,你可以,但如果你忘记了你可能会遇到大麻烦。我不知道您的网站的背景或任何有关的。我回答的基础是我在各个网站上工作的经历。 – 2010-11-03 04:41:52

1

在公共目录中有一个index.php文件也可以防止在php解释器关闭的情况下。很多框架使用index.php文件在doc根目录外包含bootstrap文件。如果发生这种情况,用户将能够看到这个文件的源代码,而不是整个代码库。

相关问题