index.php和前端控制器之间的“正确”分离/差异

时间:2013-11-29 01:35:43

标签: php design-patterns front-controller

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

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

我已经看到了这个:MVC with a front controller confusion,但这并没有解决index.php与前端控制器之间差异的问题。

3 个答案:

答案 0 :(得分:16)

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

<?php 

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

它应该只包含DOCUMENT_ROOT之外的文件。这就是全部。

这样一来,如果出现可怕的错误(例如,服务器更新后php扩展失败)并且访问者接触到原始的PHP代码,它将不会泄露任何敏感细节。

Front Controller的要点是处理所有用户输入,将其转换为耗材形式,然后根据它调度命令(通常以对象的方法调用形式) )。在像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启发的体系结构的应用程序制作也不是要求。

答案 1 :(得分:3)

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应用程序,该应用程序充当前端控制器。

答案 2 :(得分:1)

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