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


"Proper" separation/difference between index.php and front controller

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

我知道他们必须"设置环境",包括定义一些常量等,但什么能做到呢?(--自动加载器、调试程序等)

我看到过这样的情况:MVC与前控制器混淆,但这并不能解决index.php和前控制器之间的差异问题。

实际上,index.php根本不应该包含任何有意义的代码,因为它只是您网站的一部分,位于Web服务器的DOCUMENT_ROOT中。它的内容实际上应该看起来像:

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

它应该只包括DOCUMENT_ROOT之外的一个文件。仅此而已。

这样,如果出现严重错误(例如,php扩展在服务器更新后失败),并且访问者暴露在原始php代码中,则不会泄露任何敏感细节。

前端控制器的目的是处理所有用户输入,将其转换为消耗品表单,并在此基础上调度命令(通常以方法调用对象的形式)。在像Java这样的语言中,所有的东西都必须包含在一个类中,前端控制器就是一个类。但是在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

此外,您应该记住,前端控制器的概念既不是为尝试实现MVC或MVC启发架构的应用程序而设计的,也不是它们所要求的。

Index.php应该初始化应用程序,并调用一些将路由解密为控制器和操作的东西,然后运行它们。看看Yii、Symfony、CodeIgniter、CakePHP,看看它们的作用。所有这些都略有不同,但原理相同。

Yii的index.php中的一个例子表明了这一点:

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

$config被传递给作为前端控制器的web应用程序。

您真的应该了解MVC的结构,特别是在与PHP一起使用时。在index.php中初始化前端控制器的一个实例,如果该过程是前端控制器初始化过程(__constructor())的一部分,它应该会呈现您的页面。