&引用;“适当的”;index.php和前端控制器之间的分离/差异

&引用;“适当的”;index.php和前端控制器之间的分离/差异,php,design-patterns,front-controller,Php,Design Patterns,Front Controller,对于PHP MVC应用程序,index.PHP文件和前端控制器的作业有什么区别?前端控制器是在index.php中,还是在单独的文件中?我如何将两者分开,让它们一起工作?前端控制器应该是一个类(或类似于它自己的实体)吗?(如果是这种情况,那么index.php将实例化前端控制器?) 我知道他们必须“设置环境”,其中包括定义一些常量等,但做什么呢?(-自动加载器、调试工具等) 我看到了:,但这并不能解决index.php和前端控制器之间的差异问题。index.php应该初始化应用程序,调用一些东西

对于PHP MVC应用程序,
index.PHP
文件和前端控制器的作业有什么区别?前端控制器是在
index.php
中,还是在单独的文件中?我如何将两者分开,让它们一起工作?前端控制器应该是一个类(或类似于它自己的实体)吗?(如果是这种情况,那么index.php将实例化前端控制器?)

我知道他们必须“设置环境”,其中包括定义一些常量等,但做什么呢?(-自动加载器、调试工具等)


我看到了:,但这并不能解决
index.php
和前端控制器之间的差异问题。

index.php应该初始化应用程序,调用一些东西,将路由解码为控制器和操作,然后运行它们。看看Yii、Symfony、CodeIgniter、CakePHP,看看它们是做什么的。虽然略有不同,但原理相同

Yii's index.php中的一个例子说明了这一点:

<?php

$yii=dirname(__FILE__).'/../../framework/yii.php';
$config=dirname(__FILE__).'/protected/config/main.php';
require_once($yii);
Yii::createWebApplication($config)->run();

您确实应该仔细阅读MVC的结构,特别是与PHP一起使用时。在index.php中初始化front controller的一个实例,如果该过程是front controller初始化过程的一部分(
\uu constructor()
),它应该呈现您的页面。

实际上,
index.php
不应该包含任何有意义的代码,因为它只是您站点的一部分,位于Web服务器的
DOCUMENT\u ROOT
内的。它的内容实际上应该是这样的:

<?php 

    require '../application/bootstrap.php';

另外,您应该记住,前端控制器的概念既不是为尝试实现MVC或MVC架构的应用程序设计的,也不是为这些应用程序要求的。

这个答案太短,不能作为答案发布。您确实应该仔细阅读MVC的结构,特别是与PHP一起使用时。在
index.php
中初始化
front controller
的一个实例,故事的结尾。你是说
index.php
所做的就是初始化
front controller
?是的,这正是我要说的。你还想让它做什么?如果你的
前端控制器
很好并且完成了,它应该按预期工作,并在构造函数完成后呈现你的页面。@Andreas Bjørn谢谢,既然这就是我所要求的,它不会太短,不能作为答案发布。在这种情况下,我会将其作为答案发布。您所说的初始化在多大程度上是指?例如,我有一个Yii应用程序,我在其中扩展/自定义了初始化,基于它是web请求还是控制台请求、测试、开发还是生产环境。因此,相关index.php设置一些常量,加载一个初始值设定项类,然后加载相关的Yii应用程序类,传递配置并运行它。就是这样。在本例中,
index.php
和前端控制器之间有什么区别?前端控制器根据URL确定要调用的控制器和操作。它构建一个请求并将其传递给控制器。它还可以接收呈现的响应并执行额外的工作。我同意Andreas的观点,您应该阅读PHP中的MVC,并了解各种框架。例如,PHP的一个设计目标是最大限度地减少必须加载的框架代码量,因为它必须与每个请求一起加载。@jasonszhao来吧,我们已经告诉过你下一步要做什么,阅读、学习和繁荣。10分钟前你刚刚向我解释了路由的作用,你怎么能问David它的作用?胜利的道路并不容易,我的朋友,你必须为此努力。1)我认为对话真的没有必要2)你的答案与大卫·德伯的答案完全矛盾,所以我会等一等,然后再决定哪一条被接受1)好吧,根据你的喜好确定答案。2) 我的答案与@davidfuber的答案并不矛盾——他似乎认为应该在索引文件中定义路由,而我不这么认为。可能是偏好的问题。3) 如果您不知道路由是什么,您应该仔细阅读PHP和MVC的使用,因为这超出了您的问题范围。这意味着处理请求(主要是URI)并包含适当的文件,特别是controllerI没有建议在index.PHP中定义路由,只有index.php加载一个初始值设定项,然后传递给前端控制器。哇!你对我说得很清楚!非常好的回答,谢谢!在这种情况下,为什么不让.htaccess将所有请求转发到引导脚本并删除index.php?davidfuber,我对此不是100%肯定,但我认为Web服务器将无法访问指定文件夹之外的文件。否则,在我看来,这将是一个相当大的安全问题。我们的想法是让Web服务器调用index.php,然后php可以从那里获取它并访问它需要的任何内容。@DavidUnber,然后,如果
mod_php
加载失败,您将看到
bootstrap.php
文件,而不是index。这会让你回到北广场。1@Linus在该文件中所做的只是各种“路径常量”的定义。我个人认为这是一种不好的做法,原因有二。对于
mod_php
(或其替代方案),这至少会泄漏有关应用程序目录结构的部分知识。另一个问题与常量本身有关——它们引入了不可变的全局状态。这意味着代码中的某个类正在使用您没有提供的信息。你不知道去哪里,怎么去,
// --- snip --- 
// the autoloader has been initialized already a bit earlier

$router = new Router;
$router->loadConfig($configuration);

$request = new Request;
$request->setUri($GET['url']); 
// could also be $_SERVER['PATH_INFO'] or other
// depends on how url rewrite is set up

$router->route($request);
// the request instance is populated with data from first matching route

$class = $request->getParameter('resource');
$command = $request->getMethod() . $request->getParameter('action');

if (class_exists($class)) {
    $instance = new $class;
    $instance->{$command}($request);
    // you dispatch to the proper class's method 
}

// --- snip --- 
// then there will be some other code, unrelated to front controller