FleaPHP的单入口文件详解

article/2025/9/12 4:11:43

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

 

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

Php代码   收藏代码
  1. <?php  
  2. /** 
  3.  * 入口文件 
  4.  * 
  5.  * @file:index.php 
  6.  * @author:hegz 
  7.  * @update:2009/10/27 
  8.  */  
  9.   
  10. define('__ROOT__', dirname(__FILE__)); // 定义网站根目录  
  11. define('DEPLOY_MODE', true); //部署模式时启用  
  12. //define('NO_LEGACY_FLEAPHP', true); //取消与旧版FleaPHP兼容,现在作用不大  
  13.   
  14. // 装载 FleaPHP 框架文件  
  15. require(__ROOT__ . '/lib/FLEA/FLEA.php');  
  16.   
  17. /** 
  18.  * 装载配置文件 
  19.  */  
  20. FLEA::loadAppInf(__ROOT__ . DS . 'public/Config/COMMON_INF.php'); // 自定义环境配置文件  
  21. FLEA::loadAppInf(__ROOT__ . DS . 'public/Config/DSN.php'); // 数据库链接参数配置文件  
  22. FLEA::loadAppInf(__ROOT__ . DS . 'APP/Config/APP_INF.php'); // 自定义应用程序配置文件  
  23.   
  24. /** 
  25.  * 设定运行目录 
  26.  */  
  27. FLEA::import(__ROOT__);  
  28. FLEA::import(__ROOT__ . DS . 'APP');  
  29. FLEA::import(__ROOT__ . DS . 'public');  
  30.   
  31. //dump($GLOBALS['__FLEA_CORE__']['CLASS_PATH']); // 调试程序路径  
  32. //exit;  
  33.   
  34. // 以 MVC 模式运行系统  
  35. FLEA::runMVC();  
  36. ?>  
 

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

 


代码行解析

 


第十行:

Php代码   收藏代码
  1. define('__ROOT__', dirname(__FILE__));  
 

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

e:\apmxe4\htdocs\mmfs2010
 

Linux下可能为:

/www/htdocs/mmfs2010
 

第十一行:

Php代码   收藏代码
  1. define('DEPLOY_MODE', true);  
 

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

Php代码   收藏代码
  1. define('DEPLOY_MODE', false);  
 

或直接屏蔽:

Php代码   收藏代码
  1. //define('DEPLOY_MODE', true);  
 

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

第十五行:

Php代码   收藏代码
  1. require(__ROOT__ . '/lib/FLEA/FLEA.php');  
 

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

第二十~二十二行:

Php代码   收藏代码
  1. FLEA::loadAppInf(__ROOT__ . DS . 'public/Config/COMMON_INF.php');  
  2. FLEA::loadAppInf(__ROOT__ . DS . 'public/Config/DSN.php');  
  3. FLEA::loadAppInf(__ROOT__ . DS . 'APP/Config/APP_INF.php');  
 

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

其中:

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

Php代码   收藏代码
  1. <?php  
  2.   
  3. return array(  
  4.     'controllerAccessor' => 'ctl',  
  5.     'defaultController'  => 'Default',  
  6.     'actionAccessor'     => 'act',  
  7.     'urlLowerChar'       => false,  
  8.     //'dispatcher'         => 'FLEA_Dispatcher_Auth',  
  9.   
  10.     /** 
  11.      * 调度器调度失败(例如控制器或控制器方法不存在)后,要调用的自定义处理程序 
  12.      */  
  13.     'dispatcherFailedCallback'  => 'onDispatcherFailedCallback'//'dispatcher' = 'FLEA_Dispatcher_Simple'时启用  
  14.     //'dispatcherAuthFailedCallback' => 'onAuthFailedCallback', //'dispatcher' = 'FLEA_Dispatcher_Auth'时启用  
  15.   
  16.     /** 
  17.      * 指示在生成 url 时,是否总是使用应用程序入口文件名,仅限 URL_STANDARD 模式 
  18.      * 
  19.      * 如果该设置为 false,则生成的 url 类似: 
  20.      * 
  21.      * http://www.example.com/?controller=xxx&action=yyy 
  22.      */  
  23.     'urlAlwaysUseBootstrap'     => false,  
  24.   
  25.     /** 
  26.      * 指示在生成 url 时,是否总是使用完整的控制器名和动作名 
  27.      * 
  28.      * 如果该设置为 false,则默认的控制器和动作名不会出现在 url 中 
  29.      */  
  30.     'urlAlwaysUseAccessor'      => false,  
  31.   
  32.     'responseCharset'    => 'gb2312',  
  33.     'defaultLanguage'    => 'chinese-gb2312',  
  34.     'databaseCharset'    => 'gb2312',  
  35.     'RBACSessionKey'     => 'RBAC_MMFS2009',  
  36.     //'autoResponseHeader'        => false,  
  37.     'internalCacheDir'   => __ROOT__ . DS . '_cache',  
  38.   
  39.     /** 
  40.      * WebControls 扩展控件的保存目录 
  41.      */  
  42.     'webControlsExtendsDir'     => __ROOT__ . DS . 'public/WebControls',  
  43.   
  44.     /** 
  45.      * 指示是否启用日志服务,设为true时启用 
  46.      */  
  47.     'logEnabled'         => false,  
  48.   
  49. );  
  50.   
  51. ?>  
 

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

Php代码   收藏代码
  1. <?php  
  2. /** 
  3.  * 数据库连接参数 
  4.  */  
  5. return array(  
  6.     'dbDSN'     => array(  
  7.         'driver'        => 'mysql',  
  8.         'host'          => 'localhost',  
  9.         'login'         => 'mmfs2009',  
  10.         'password'      => '×××××××',  
  11.         'database'      => 'mmfs2009',  
  12.     )  
  13. );  
  14.   
  15. ?>  
 

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

Php代码   收藏代码
  1. <?php  
  2.   
  3. return array(  
  4.     'dispatcher'       => 'FLEA_Dispatcher_Auth',  
  5.   
  6.     /** 
  7.      * 指示 RBAC 组件要使用的默认 ACT 文件(使用单个ACT文件) 
  8.      */  
  9.     'defaultControllerACTFile' => __ROOT__ . DS . 'APP/Controller/App.act.php',  
  10.   
  11.     'view' => 'FLEA_View_Smarty',  
  12.     'viewConfig' => array(  
  13.         'smartyDir'         => __ROOT__ . DS . 'lib/Smarty',  
  14.         'template_dir'      => __ROOT__ . DS . 'APP/Templates',  
  15.         'compile_dir'       => __ROOT__ . DS . '_cache/1',  
  16.         'left_delimiter'    => '{{',  
  17.         'right_delimiter'   => '}}',  
  18.     ),  
  19. );  
  20. ?>  
 

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

第二十七~二十九行:

Php代码   收藏代码
  1. FLEA::import(__ROOT__);  
  2. FLEA::import(__ROOT__ . DS . 'APP');  
  3. FLEA::import(__ROOT__ . DS . 'public');  
 

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

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

Php代码   收藏代码
  1. /** 
  2.  * 导入文件搜索路径 
  3.  * 
  4.  * FLEA::loadClass()、FLEA::getSingleton() 会在搜索路径中查找指定名字的类定义文件。 
  5.  * 因此需要调用 FLEA::import() 将存放类定义文件的目录添加到搜索路径中。 
  6.  * 但是,不应该将类文件所在目录直接添加到搜索路径中,而是根据类的命名来决定要添加哪一个目录。 
  7.  * 
  8.  * 例如类名称是 Table_Posts,而实际的文件是 ./APP/Table/Posts.php。 
  9.  * 那么应该添加的目录就是 ./APP,而不是 ./APP/Table 。 
  10.  * 
  11.  * example: 
  12.  * <code> 
  13.  * FLEA::import(APP_DIR . '/LIBS'); 
  14.  * </code> 
  15.  * 
  16.  * @param string $dir 
  17.  */  
  18. function import($dir)  
  19. {  
  20.     if (array_search($dir$GLOBALS[G_FLEA_VAR]['CLASS_PATH'], true)) { return; }  
  21.     if (DIRECTORY_SEPARATOR == '/') {  
  22.         $dir = str_replace('\\', DIRECTORY_SEPARATOR, $dir);  
  23.     } else {  
  24.         $dir = str_replace('/', DIRECTORY_SEPARATOR, $dir);  
  25.     }  
  26.     $GLOBALS[G_FLEA_VAR]['CLASS_PATH'][] = $dir;  
  27. }  
 

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

Php代码   收藏代码
  1. //dump($GLOBALS['__FLEA_CORE__']['CLASS_PATH']); // 调试程序路径  
  2. //exit;  
 

去掉双斜线:

Php代码   收藏代码
  1. dump($GLOBALS['__FLEA_CORE__']['CLASS_PATH']); // 调试程序路径  
  2. 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等子目录

第三十五行:

Php代码   收藏代码
  1. FLEA::runMVC();  
 

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

Php代码   收藏代码
  1. 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()方法。


http://chatgpt.dhexx.cn/article/O1Nufh7x.shtml

相关文章

介绍国产的PHP MVC框架:FleaPHP

国产的PHP MVC框架&#xff1a;FleaPHP 官方网站&#xff1a;http://www.fleaphp.org框架下载&#xff1a;http://www.fleaphp.org/download框架API &#xff1a;http://www.fleaphp.org/docs/api/index.html开发指南&#xff1a;http://www.fleaphp.org/guide框架社区&#…

FleaPHP 开发指南 - 7. 数据表关联

数据表关联是指两个或者多个数据表的记录之间的逻辑关系。 例如&#xff1a; 每一个公民都有一个身份证号码 每一位作者都写了多本&#xff08;0-n&#xff09;书籍&#xff0c;而每一本书籍都有多个&#xff08;1-n&#xff09;作者 每一篇文章都有多个&#xff08;0-n&…

FleaPHP 开发指南 - 5. 应用程序设置

FleaPHP 是一个具有高度灵活性的框架。开发者可以用不同的设置来调整 FleaPHP 的工作方式。这些设置统一保存在名为“应用程序设置”的数据源中。 实际上,除了 FleaPHP 框架本身,应用程序也可以使用“应用程序设置”来保存应用程序运行时需要的各种设置。 FleaPHP 的应用程…

FleaPHP 开发指南 - 6. 访问数据库

这一章我们就来看看 FleaPHP 的数据库访问功能。体验一下 FleaPHP 出色的自动化 CRUD 能力。 连接数据库 在 htdocs 目录中创建子目录 testDB&#xff0c;并在子目录下创建文件 test1.php 文件&#xff0c;内容如下&#xff1a; <?phprequire(../FLEA/FLEA.php);__FLEA_P…

FleaPHP 的 Ajax 支持和 WebControls

原文地址&#xff1a; http://www.fleaphp.org/bbs/viewthread.php?tid40 FleaPHP 现在具有了基本的 Ajax 支持&#xff0c;示例代码如下&#xff1a; 首先在控制器显示模版的动作方法中有如下代码&#xff1a; /* * * 显示登录界面 */ function actionIndex() {…

实际采用 FleaPHP 的网站

下面都是采用 FleaPHP 框架开发的网站列表&#xff0c;如果发现无效连接请在留言。 如果你有采用 FleaPHP 开发的网站&#xff0c;并且愿意公开网址&#xff0c;可以发邮件到 dualface (at) gmail.com 需要提供的信息包括网站名称和连接地址&#xff0c;以及简单的介绍文字。…

获取和安装 FleaPHP

目前 FleaPHP 还处于开发中&#xff0c;您应该经常访问该页面&#xff0c;下载最新版本的 FleaPHP&#xff0c;或者通过 Subversion 仓库直接更新本地的 FleaPHP 代码。 FleaPHP 完全版和 FleaPHP runtime 核心合计下载次数已经超过 2000 次。 下载 FleaPHP 如果无法使用 Sub…

关于 FleaPHP

FleaPHP 并不是心血来潮的结果&#xff0c;而是作者在 Web 开发中不断探索的成果。虽然 FleaPHP 缺乏 Zend Framework 那样巨大的号召力&#xff0c;也没有 CakePHP 和 Symfony 那样庞大的社区。但 FleaPHP 仍然是一个值得你花时间去了解、去学习的框架。 FleaPHP 的设计目标 F…

http头部content-type与数据格式

http 头部中的 content-type 和我们传递的数据是息息相关的&#xff0c;不同的取值&#xff0c;服务器解析处理方式不同&#xff0c; 介绍一下几种常见的方式 text/plain&#xff1a;ajax默认方式&#xff0c;将文件设置为纯文本的形式&#xff0c;浏览器在获取到这种文件时…

http 协议中的content-type

content-type可以位于请求头、响应头&#xff0c;分别代表&#xff1a; Request头&#xff1a;请求的与实体对应的MIME信息&#xff08;post请求时的请求体&#xff09;Response头&#xff1a;返回内容的MIME类型 由于http1.0版规定&#xff0c;头信息必须是 ASCII 码类型&am…

contentType的类型及其在上传下载的例子

content-type之上传下载 下载 Content-Type 实体头部用于指示资源的MIME类型&#xff0c;在响应中&#xff0c;Content-Type标头告诉客户端实际返回的内容的类型。 Content-Disposition 是 MIME 协议的扩展&#xff0c;通常用在下载文件时&#xff0c;是下载文件的一个标识字…

Http中Content-Type等属性详解

前言 一直以来对HTTP请求中各种属性一知半解,偶然在博客中找到一篇,特意摘录过来方便自己以后查看. 正文 敬请关注博客&#xff0c;后期不断更新优质博文&#xff0c;谢谢 这里讲解Content-Type的可用值&#xff0c;以及在spring MVC中如何使用它们来映射请求信息。 1. Con…

HTTP首部——Content-Type的作用

前言 对于我们习以为常的东西&#xff0c;却没有仔细思考它的作用。 HTTP的首部都各有个的价值&#xff0c;最近看到这个Content-Type&#xff0c;忽然让我想起来以前自己的一个小小的失误&#xff0c;而产生了一个bug。但是当时却搞得我焦头烂额&#xff0c;我在网络上查找了一…

http(S)系列之(一):概念

参考文章&#xff1a; HTTP & HTTPS网络协议重点总结&#xff08;基于SSL/TLS的握手、TCP/IP协议基础、加密学&#xff09; 一篇比较全的HTTP协议详解 记&#xff1a;千万别误会&#xff0c;本章是完全ctrlc然后ctrlv&#xff0c;知识理解才是最重要&#xff0c;不必要在…

http 协议之 Content-Type

Content-Type 字段是 http 服务端返回给客户端时&#xff0c;head 里面带上的&#xff0c;这个字段表明服务端返回给客户端的 body 是什么类型的&#xff0c;然后客户端就可以根据这个类型进行文件处理。如浏览器客户端&#xff0c;针对 text/html 类型时&#xff0c;是直接显示…

Http中的Content-Type详解

Content-Type Content-Type&#xff08;MediaType&#xff09;&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff0c;也叫做MIME类型。在互联网中有成百上千中不同的数据类型&#xff0c;HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签&#x…

HTTP(S)协议详解

1 什么是协议 协议&#xff0c;网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信交流。 粗俗理解协议就是 比如你的电脑和我的电脑要通信&#xff0c;&a…

详解Http的Content-Type

目录 1.概述 2.常用类型 2.1.application/x-www-form-urllencoded 2.2.application/json 3.Spring MVC支持的编码 3.1.实验 3.2.适配器 3.3.自定义适配器 1.概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;超文本传输协议。超文本&#xf…

Http协议之Content-Type理解

Content-Type&#xff0c;翻译过来就是”内容类型“&#xff0c;在互联网中就是”互联网媒体类型“。 在互联网中&#xff0c;两台计算机经常会传输数据&#xff0c;客户端会给服务器发数据&#xff0c;服务器也会给客户端发数据。数据的类型也是有很多种的&#xff0c;我们把所…

tomcat修改jdk配置两种方法

由于一个电脑多个项目,可能会使用多个版本的jdk,所以在跑tomcat的时候,可以自定义配置的各项目所使用的jdk 配置步骤(window设置): 1. 在catalina.bat找到如下代码: echo Using JAVA_HOME: “%JAVA_HOME%” 替换成 echo Using JAVA_HOME: “E:\Company\Tool\jdk1.7.0_13” 如…