FleaPHP的单入口文件详解

论坛贴:http://qeephp.com/bbs/thread-10922-1-1.html

 

贴记:

无所谓贴记,只是开篇明义罢了。大家看到这个东西,不禁会问,“大哥啊,你这篇东西如果在2008年,不,2007年初就贴出来还说的过去,现在贴出来,是不是太晚了?还有什么意义呢?”。呵呵......,晚是晚了点,意义还是有的。虽然FleapHP的fans现在是越来越少了,但正因为其人少,我们才需要坚持,才需要互相打气。孔子说过,“仁,吾固守也!”。在此,我要说:“FleapHP,吾固守也!”——FleaPHP也是我所一直坚持的,你们呢?

--------x-------x-------x-------x-------x-----x----> 美丽分隔线 <------x-------x------x------x------x--------x-------x--------x-------

在 FleaPHP 应用程序使用 MVC 模式时,应用程序的所有功能都通过一个单一的文件来调用。这种通过单一文件来执行所有功能的应用程序,称为单一入口应用程序。

 

该文件通常放在程序主目录下。其代码如下所示:

<?php
/**
 * 入口文件
 *
 * @file:index.php
 * @author:hegz
 * @update:2009/10/27
 */

define('__ROOT__', dirname(__FILE__)); // 定义网站根目录
define('DEPLOY_MODE', true); //部署模式时启用
//define('NO_LEGACY_FLEAPHP', true); //取消与旧版FleaPHP兼容,现在作用不大

// 装载 FleaPHP 框架文件
require(__ROOT__ . '/lib/FLEA/FLEA.php');

/**
 * 装载配置文件
 */
FLEA::loadAppInf(__ROOT__ . DS . 'public/Config/COMMON_INF.php'); // 自定义环境配置文件
FLEA::loadAppInf(__ROOT__ . DS . 'public/Config/DSN.php'); // 数据库链接参数配置文件
FLEA::loadAppInf(__ROOT__ . DS . 'APP/Config/APP_INF.php'); // 自定义应用程序配置文件

/**
 * 设定运行目录
 */
FLEA::import(__ROOT__);
FLEA::import(__ROOT__ . DS . 'APP');
FLEA::import(__ROOT__ . DS . 'public');

//dump($GLOBALS['__FLEA_CORE__']['CLASS_PATH']); // 调试程序路径
//exit;

// 以 MVC 模式运行系统
FLEA::runMVC();
?>
 

注意:上面代码中的 DS 为FleaPHP框架文件中定义的路径分隔符,是一个常量,Windows下为“\”,Linux下为“/”。

 


代码行解析

 


第十行:

define('__ROOT__', dirname(__FILE__));
 

定义网站根目录的常量,其结果可能像下面所示:

e:\apmxe4\htdocs\mmfs2010
 

Linux下可能为:

/www/htdocs/mmfs2010
 

第十一行:

define('DEPLOY_MODE', true);
 

程序部署在实际生产环境下使用时启用,这时程序将自动调用FleaPHP框架下的FLEA/FLEA/Config/DEPLOY_MODE_CONFIG.php配置文件初始化程序执行环境。
在开发环境下,需要详细显示一些出错信息,以方便调试,可以将true改为false,或直接屏蔽掉该语句即可。如下面所示:

define('DEPLOY_MODE', false);
 

或直接屏蔽:

//define('DEPLOY_MODE', true);
 

此时,程序将自动调用FleaPHP框架下的FLEA/FLEA/Config/DEBUG_MODE_CONFIG.php配置文件初始化程序执行环境。有时间的话,大家可以比较一下这两个文件里面的配置参数的异同。

第十五行:

require(__ROOT__ . '/lib/FLEA/FLEA.php');
 

这个很好明白,就是装载FleaPHP框架文件FLEA.php,在框架文件装载过程中,将根据DEPLOY_MODE的参数值来装载默认配置文件。

第二十~二十二行:

FLEA::loadAppInf(__ROOT__ . DS . 'public/Config/COMMON_INF.php');
FLEA::loadAppInf(__ROOT__ . DS . 'public/Config/DSN.php');
FLEA::loadAppInf(__ROOT__ . DS . 'APP/Config/APP_INF.php');
 

以上三个语句为装载一些自定义的配置文件,程序运行后将用自定义配置文件中的参数覆盖默认的全局配置参数。

其中:

COMMON_INF.php文件是一些公用的环境配置参数,如下所示:

<?php

return array(
    'controllerAccessor' => 'ctl',
    'defaultController'  => 'Default',
    'actionAccessor'     => 'act',
    'urlLowerChar'       => false,
    //'dispatcher'         => 'FLEA_Dispatcher_Auth',

    /**
     * 调度器调度失败(例如控制器或控制器方法不存在)后,要调用的自定义处理程序
     */
    'dispatcherFailedCallback'  => 'onDispatcherFailedCallback', //'dispatcher' = 'FLEA_Dispatcher_Simple'时启用
    //'dispatcherAuthFailedCallback' => 'onAuthFailedCallback', //'dispatcher' = 'FLEA_Dispatcher_Auth'时启用

    /**
     * 指示在生成 url 时,是否总是使用应用程序入口文件名,仅限 URL_STANDARD 模式
     *
     * 如果该设置为 false,则生成的 url 类似:
     *
     * http://www.example.com/?controller=xxx&action=yyy
     */
    'urlAlwaysUseBootstrap'     => false,

    /**
     * 指示在生成 url 时,是否总是使用完整的控制器名和动作名
     *
     * 如果该设置为 false,则默认的控制器和动作名不会出现在 url 中
     */
    'urlAlwaysUseAccessor'      => false,

    'responseCharset'    => 'gb2312',
    'defaultLanguage'    => 'chinese-gb2312',
    'databaseCharset'    => 'gb2312',
    'RBACSessionKey'     => 'RBAC_MMFS2009',
    //'autoResponseHeader'        => false,
    'internalCacheDir'   => __ROOT__ . DS . '_cache',

    /**
     * WebControls 扩展控件的保存目录
     */
    'webControlsExtendsDir'     => __ROOT__ . DS . 'public/WebControls',

    /**
     * 指示是否启用日志服务,设为true时启用
     */
    'logEnabled'         => false,

);

?>
 

DSN.php为数据库链接参数定义文件,如下所示:

<?php
/**
 * 数据库连接参数
 */
return array(
    'dbDSN'     => array(
        'driver'        => 'mysql',
        'host'          => 'localhost',
        'login'         => 'mmfs2009',
        'password'      => '×××××××',
        'database'      => 'mmfs2009',
    )
);

?>
 

APP_INF.php为自定义前台程序运行参数文件,如下所示:

<?php

return array(
    'dispatcher'       => 'FLEA_Dispatcher_Auth',

    /**
     * 指示 RBAC 组件要使用的默认 ACT 文件(使用单个ACT文件)
     */
    'defaultControllerACTFile' => __ROOT__ . DS . 'APP/Controller/App.act.php',

    'view' => 'FLEA_View_Smarty',
    'viewConfig' => array(
        'smartyDir'         => __ROOT__ . DS . 'lib/Smarty',
        'template_dir'      => __ROOT__ . DS . 'APP/Templates',
        'compile_dir'       => __ROOT__ . DS . '_cache/1',
        'left_delimiter'    => '{{',
        'right_delimiter'   => '}}',
    ),
);
?>
 

这三个配置文件为什么不合并到一个配置文件中呢?这个是可以的,但在有些场合下使用起来不太方便,也不方便修改。一般来说,公共配置参数配置好后很少改动,但数据库参数链接参数在部署到生产环境中时,很可能需要修改的。还有,考虑到前台程序与后台程序拆分成两个目录的情况,如果后台也有一个入口文件的话,很多参数也发生了变化,比如路径参数,使得前后台程序都需要有各自的一套运行参数,这时将配置文件拆分就很有好处了。

第二十七~二十九行:

FLEA::import(__ROOT__);
FLEA::import(__ROOT__ . DS . 'APP');
FLEA::import(__ROOT__ . DS . 'public');
 

以上语句用来设定程序的运行目录。执行程序后,将把路径数据放入全局数组$GLOBALS['__FLEA_CORE__']['CLASS_PATH']中存放,以方便后续使用。

import()在框架文件中定义,这是一个静态方法。其代码为:

    /**
     * 导入文件搜索路径
     *
     * FLEA::loadClass()、FLEA::getSingleton() 会在搜索路径中查找指定名字的类定义文件。
     * 因此需要调用 FLEA::import() 将存放类定义文件的目录添加到搜索路径中。
     * 但是,不应该将类文件所在目录直接添加到搜索路径中,而是根据类的命名来决定要添加哪一个目录。
     *
     * 例如类名称是 Table_Posts,而实际的文件是 ./APP/Table/Posts.php。
     * 那么应该添加的目录就是 ./APP,而不是 ./APP/Table 。
     *
     * example:
     * <code>
     * FLEA::import(APP_DIR . '/LIBS');
     * </code>
     *
     * @param string $dir
     */
    function import($dir)
    {
        if (array_search($dir, $GLOBALS[G_FLEA_VAR]['CLASS_PATH'], true)) { return; }
        if (DIRECTORY_SEPARATOR == '/') {
            $dir = str_replace('\\', DIRECTORY_SEPARATOR, $dir);
        } else {
            $dir = str_replace('/', DIRECTORY_SEPARATOR, $dir);
        }
        $GLOBALS[G_FLEA_VAR]['CLASS_PATH'][] = $dir;
    }
 

现在来看看,执行了三个FLEA::import()语句后,$GLOBALS['__FLEA_CORE__']['CLASS_PATH']里有什么 东西。
去掉index.php文件中下面语句的两个反斜线,如下面所示:

//dump($GLOBALS['__FLEA_CORE__']['CLASS_PATH']); // 调试程序路径
//exit;
 

去掉双斜线:

dump($GLOBALS['__FLEA_CORE__']['CLASS_PATH']); // 调试程序路径
exit;
 

执行程序,结果显示如下:

Array
(
[0] => e:\apmxe4\htdocs\mmfs2010\lib\FLEA
[1] => e:\apmxe4\htdocs\mmfs2010
[2] => e:\apmxe4\htdocs\mmfs2010\APP
[3] => e:\apmxe4\htdocs\mmfs2010\public
)
 

说明一下:

mmfs2010 -- 程序主目录,
lib\FLEA -- FleaPHP框架文件存放目录
APP -- 前台应用程序目录,里面含有Config、Controller、Templates子目录
public -- 公共文件存放目录,里面含有Config、Model、Table、WebControls等子目录

第三十五行:

FLEA::runMVC();
 

这是入口文件中的最后一个语句,以 MVC 模式运行系统。如果是以非 MVC 模式运行系统,则执行

FLEA::init();
 

命令。

FLEA::init() 主要完成下列工作:

安装 FleaPHP 异常的处理例程
根据应用程序设置设置决定是否载入日志服务
检查 php.ini 中 magic_quotes 设置是否为 on,并将被 PHP 自动转义后的数据撤销转义
根据应用程序设置的 urlMode 决定是否对 URL 进行处理
根据应用程序设置 requestFilters 决定运行哪些输入过滤器
根据应用程序设置 autoLoad 决定自动载入哪些文件
根据应用程序设置 sessionProvider 和 autoSessionStart 决定使用哪一个 session 服务
根据应用程序设置 responseCharset 和 requestCharset 定义常量 RESPONSE_CHARSET 和 DATABASE_CHARSET
根据应用程序设置 multiLangaugeSupport 决定是否载入多语言支持
根据应用程序设置 autoResponseHeader 决定是否自动输出 HTTP HEADER 信息
这些初始化工作对于应用程序的绝大部分来说都是必须。因此务必记得在 require('FLEA.php') 后要调用 FLEA::init()。

FLEA::runMVC()的作用:

如果要使用 FleaPHP 的 MVC 模式。那么在载入 FLEA.php 后,调用 FLEA::runMVC() 即可启动 MVC 模式。
在 MVC 模式启动后,FleaPHP 会根据 URL 地址中包含的控制器名称和控制器动作名称,执行开发者编写的控制器代码。

其实,FLEA::runMVC()内部也调用了FLEA::init()方法。

 

 

你可能感兴趣的:(PHP,框架,linux,mvc,应用服务器)