对于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()
)的一部分,它应该会呈现您的页面。