本页主题: 推荐FleaPHP:学习FleaPHP开发框架、从开发指南…… 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

jacking

该用户目前不在线
级别: 论坛版主
精华: 2
发帖: 294
威望: 299 点
金钱: 2980 RMB
贡献值: 0 点
注册时间:2007-05-17
最后登录:2008-08-07

推荐FleaPHP:学习FleaPHP开发框架、从开发指南……


=====================================================================虽然说N人才用框架开发!即使不是N人的偶、感觉到自己需要学习它……

        从实际出发、结合工作、团队的需要,今天开始学习FleaPHP开发框架……偶从官方网站copy过来FleaPHP开发框架的开发指南~并研究学习!

FleaPHP 开发指南提供了使用 FleaPHP 开发应用程序的各方面内容。开发指南中,大部分文章属于 Step by Step 的教程形式,少数文章深入描述 FleaPHP 的某些重要特征。
虽然我尽可能将开发指南写来简单易懂,但阅读者仍然要掌握一些基本的知识:
  • 熟悉 PHP 和 Web 开发 很遗憾,虽然 FleaPHP 尽可能实现简单易用的目标。但基本的 PHP 开发知识仍然是必须的。同时,为了能更好的利用 FleaPHP,你对 PHP 最好能达到熟悉的程度。如果有一定的 Web 开发经验,那就更好了。
  • 了解基本的数据库设计和使用 绝大多数 Web 应用都要和数据库打交道,所以你需要这方面的知识。同时,简化数据库操作也是 FleaPHP 的一个主要努力目标。
  • 熟悉各种开发工具的使用 FleaPHP 开发指南中不会浪费太多篇幅去讲解开发工具的使用。总的来说,开发指南使用的各种开发工具都是普遍应用的,包括:
    • phpMyAdmin – 基于 Web 界面的 MySQL 数据库管理和开发工具
    • Firefox – 出色的浏览器,可以安装多种辅助开发的扩展
    • Zend Development Environment – 迄今为止功能最全面的 PHP 集成开发环境
如果你具备上述条件,并且愿意花上几个小时来阅读一部分文章。那么你会发现 FleaPHP 可以大大简化你日常工作中重复编写的大量代码,帮助你更快、更好的完成开发工作。
准备好了吗?
ENJOY PROGRAMMING !



顶端 Posted: 2008-03-20 18:34 | [楼 主]
jacking

该用户目前不在线
级别: 论坛版主
精华: 2
发帖: 294
威望: 299 点
金钱: 2980 RMB
贡献值: 0 点
注册时间:2007-05-17
最后登录:2008-08-07

1. 开始前的准备工作
Submitted by admin on Mon, 2006-08-28 10:39. manual
[以下内容适用于 FleaPHP 1.0.70]

为了避免各种不同开发环境配置对学习 FleaPHP 造成的干扰,因此建议你按照本文配置一个专门用于学习 FleaPHP 的开发环境。

步骤:

首先 下载 APM Express 5 和 FleaPHP 完全版,并解压缩到硬盘。
最后,启动 APMXE5,并从任务栏系统托盘区的 APM Express 图标上选择“Start”菜单,运行 Apache 和 MySQL。
有关 APM Express 的详细信息,请参考APM Express 1.5 火爆公测。

注意:在开发指南中,如果没有特别说明,htdocs 均指存放 PHP 脚本文件的目录。当你使用 APMXE5,并且将其解压缩到 D:\APMXE5 目录时,则 htdocs 目录等同于 D:\APMXE5\htdocs 目录。
顶端 Posted: 2008-03-20 18:37 | 1 楼
jacking

该用户目前不在线
级别: 论坛版主
精华: 2
发帖: 294
威望: 299 点
金钱: 2980 RMB
贡献值: 0 点
注册时间:2007-05-17
最后登录:2008-08-07

什么叫做设计模式?

    简单来说,设计模式(Pattern)就是解决某一类问题的特定方法。由于这种特定方法在解决同类问题时具有通用性,所以我们就可以一次又一次的利用已有的经验。具体到程序编写上,就是我们可以用类似的程序结构和代码解决同类型的问题。有关设计模式的详细内容,可以阅读经典著作《设计模式》,这里我就不班门弄斧了。

    MVC 实际上是一系列略有不同的模式。FleaPHP 采用的是Passive(被动)MVC 模式。

    在 Passive MVC 模式中,Model(模型)完全不知道自己身处于 MVC 结构之中。换句话说,Model 就是一个普通的对象,与 MVC 模式里面的其他组成部分完全没有关联。具体而言,MVC 模式涉及到下列三类对象:

M 代表 Model,即模型,用于封装与业务逻辑有关的代码和数据。例如对订单的各种计算。
V 代表 View,即视图,用于呈现内容给用户(也就是将程序运行的结果返回给浏览器显示)。例如商品列表页面、后台登录页面。
C 代表 Controller,即控制器,用于接收用户输入(通过浏览器发起的请求),然后调用模型(Model)对输入数据进行处理并获得处理结果。最后将结果传递到视图(View),从而让用户能够看到自己操作的结果。例如用户点击删除文章按钮后,控制器调用操作文章的模型,删除掉指定文章,最后通过视图显示成功删除文章的提示信息。
经过这样简单的分离,我们就把应用程序操作数据的代码(绝大部分 Web 应用程序都是对数据进行操作)和处理用户输入输出的代码分离开来了。

这种分离有许多好处:

1、清晰的将应用程序分隔为独立的部分;
2、业务逻辑代码能够很方便的在多处重复使用;
3、方便开发人员分工协作;
4、如果需要,可以方便开发人员对应用程序各个部分的代码进行测试。
5、如果你上面的文字让你觉得很无聊或者不够严谨,那么说明你已经很熟悉 MVC 模式了。如果你看到上面的文字感到无所适从,那说明你还需要多阅读一些面向对象相关的书籍和文档。


--------------------------------------------------------------------------------



        应用程序执行流程
下面的插图描述了基于 FleaPHP 应用程序的执行流程。




    index.php 是应用程序的入口文件,负责定义一些应用程序必须的常量,并载入 FleaPHP 框架,然后执行 run() 函数;
    过滤器链完成 HTTP 请求数据解析、MagicQuotes 处理等工作;
应用程序控制根据 HTTP 请求,调用领域逻辑、表数据入口、组件等,并将处理结果传送到视图/模板;
    视图/模板根据应用程序控制器提供的数据生成输出内容并传送到浏览器。
在 FleaPHP 中,index.php 里面的 run() 在调用过滤器链后,会运行一个调度器。该调度器根据 HTTP 请求参数决定要调用的应用程序控制器。例如 index.php?controller=blog&action=list 这个请求表示要调用名为 blog 的应用程序控制器的 list 动作。然后调度器会调用这个控制器的动作。



在 FleaPHP 应用程序中,控制器实现为一个类,控制器动作就是该类的一个方法。

在控制器(MVC 模式中的 Controller)方法中,通过调用领域逻辑代码(MVC 模式中的 Model)来处理 HTTP 请求提交的数据并获得结果。然后再将结果传递给视图(MVC 模式中的 View)。视图根据控制器方法提供的参数从模板文件构造最终的页面内容,并返回给浏览器。
顶端 Posted: 2008-03-20 18:41 | 2 楼
jacking

该用户目前不在线
级别: 论坛版主
精华: 2
发帖: 294
威望: 299 点
金钱: 2980 RMB
贡献值: 0 点
注册时间:2007-05-17
最后登录:2008-08-07

        与许多开发框架一样,FleaPHP 通常也使用一个入口文件来启动框架,并运行应用程序代码。虽然 FleaPHP 并不要求应用程序必须使用单一的入口文件,不过在本系列文章中,我大部分时间都使用单一入口文件。

============================================================================

单一入口应用程序
在 FleaPHP 应用程序使用 MVC 模式时,应用程序的所有功能都通过一个单一的文件来调用。这种通过单一文件来执行所有功能的应用程序,称为单一入口应用程序。有关单一入口应用程序的一些信息,可以参考 ChinaUnix 上的一篇帖子。

许多著名的 PHP 应用程序都是单一入口,例如 Drupal、WordPress、XOOPS、Mambo 等。当然也有 phpMyAdmin 这样的非单一入口应用程序。

============================================================================

创建入口文件
现在,我们来创建一个最简单的入口文件。打开文本编辑器,创建 htdocs\index.php 文件,内容如下:

Copy code
<?php
require('FLEA/FLEA.php');
FLEA::runMVC();


现在启动浏览器,输入地址:http://localhost/index.php,应该就可以看到如下的画面:



这个画面显示了一个错误信息,但是也表明 index.php 中的两行代码已经成功启动了 FleaPHP 框架。

==========================================================================

实现我们的第一个控制器
在 FleaPHP 应用程序中,应用程序包含多个控制器。每一个控制器又提供一组控制器动作(后文及本系列文章中都简称为“动作”)。每一个浏览器发送给 FleaPHP 应用程序的请求,都是由一个动作来处理的。将一组相关的动作集中到一起,就形成了一个控制器。

现在我们来实现第一个控制器:

创建 htdocs\APP\Controller 目录,并创建文件 htdocs\APP\Controller\Default.php (注意严格匹配目录名和文件名的大小写),内容如下:

Copy code
<?php
class Controller_Default
{
    function actionIndex() {
        echo "My first controller.";
    }
}

同时修改 index.php 入口文件,内容改为:

Copy code
<?php
require('FLEA/FLEA.php');
FLEA::import(dirname(__FILE__) . '/APP');
FLEA::runMVC();


现在切换到浏览器,点击“刷新”按钮,可以看到 Default.php 文件中的 actionIndex 方法正确执行了。




从刚刚这个例子可以看到,每一个控制器实际上就是一个类,而一个动作则是该类的一个方法。


============================================================================

添加更多的动作
现在我们为这个控制器添加更多的 Action 方法:

Copy code
<?php
class Controller_Default
{
    function actionIndex() {
        echo "My first controller.";
    }

    function actionSay() {
        echo "Oh, FleaPHP great!";
    }
}

切换到浏览器,将浏览地址从 http://localhost/index.php 改为 http://localhost/index.php?action=say 并按回车键。可以看到输出内容改变了。



由此可见,action 参数的值决定了要调用控制器中的哪一个动作方法。在上面的例子中,action=say 时,调用的动作方法为 actionSay。因为 FleaPHP 默认要求每一个动作方法必须加上前缀 action。如果不提供 action 参数,则名为 index 的动作方法 actionIndex() 会被调用。

=======================================================================

实现更多的控制器
创建新文件 htdocs\APP\Controller\Book.php,并输入内容:

Copy code
<?php
class Controller_Book
{
    function actionIndex() {
        echo "Book controller default action.";
    }

    function actionSayTitle() {
        echo h("<< Boost up with FleaPHP >>");
    }
}

现在切换到浏览器,输入地址 http://localhost/index.php?controller=Book&action=sayTitle,并按回车键。可以看到我们成功的调用了另一个控制器的动作方法。



与使用 action 参数指定要调用的动作类似,用 controller 参数可以指定要调用的控制器。而此时 action 参数指定的就是该控制器的动作。
[ 此贴被jacking在2008-03-20 18:53重新编辑 ]
顶端 Posted: 2008-03-20 18:46 | 3 楼
jacking

该用户目前不在线
级别: 论坛版主
精华: 2
发帖: 294
威望: 299 点
金钱: 2980 RMB
贡献值: 0 点
注册时间:2007-05-17
最后登录:2008-08-07

FleaPHP 的命名规则和目录结构初看上去比较复杂,但习惯以后,你会发现这种命名规则带来许多好处。因此像 Zend Framework 也是采用同样的做法。

当然,FleaPHP 对于应用程序的命名规则和目录结构没有强制性要求。只不过采用一致的命名规则和目录结构,可以方便对应用程序维护。同时 FleaPHP 应用程序开发者之间也可以更容易的进行协作。

============================================================================

全局函数的命名规则
全局函数的命名规则是用“_”分隔全小写的单词。例如 get_cache()。同时,函数的名字采用“动词+宾语”的形式。例如 write(动词)_cache(宾语)。

不过有些全局函数为了和 PHP 中已有的类似函数保持一致,采用了不同的命名方式(顺便抱怨一下,PHP 自身的全局函数命名比较混乱,各种形式的都有)。

============================================================================

类的命名规则
所有 FleaPHP 自带的类,都以 FLEA_ 开头。然后根据用途命名。例如 FLEA_Controller_Action、FLEA_Helper_ImgCode。然后将类名字中的“_”替换为目录分隔符,就是这个类的定义文件所在位置。

举例:

FLEA_Controller_Action 类,保存文件为 FLEA/Controller/Action.php
FLEA_Db_TableDataGateway 类,保存文件为 FLEA/Db/TableDataGateway.php

这种命名规则和目录结构的优缺点如下:

优点:

避免命名冲突
根据类名字就能找到文件存放位置
应用程序中可以使用 FleaPHP 的 FLEA::import()、FLEA::loadClass() 方法方便的载入类定义文件
如果使用 PHP5,可以很方便的用 __autoload() 来自动载入需要的类定义:
Copy code
<?php
function __autoload($className) {
    FLEA::loadClass($className, true);
}

缺点:

类名字较长,不便于输入,例如 FLEA_Rbac_UsersManager
也许和现有习惯不同,需要时间来适应
对于第一个缺点,使用 Zend Development Environment 或者 Eclipse 这样的 IDE 可以缓解。这些 IDE 提供强大的输入自动完成功能,通常输入类名字的开头几个字母,就会显示候选列表让开发者选择。

============================================================================

变量和常量命名
在 FleaPHP 中,变量分为全局变量、临时变量和模版变量三类。

全局变量和常量
全局变量和常量都使用全大写,以“_”分隔。例如 $GLOBALS['CLASS_PATH'] 和 FLEA_DIR。不过 FleaPHP 中尽量避免了使用全局变量和常量,因此一般来说不会和应用程序产生冲突。

临时变量
函数、类方法中使用的变量都是临时变量,命名规则是第一个单词小写,后续的单词第一个字母大写。例如 $requestFilters、$dispatcherClass 等。

模版变量
之所以要把模版变量单独列出来,是因为不同的模版引擎对变量名有不同的规范。从我个人来说,我倾向于模版变量使用全小写单词,并以“_”分隔,例如 $latest_products_list。这样在程序里面一眼就能看出哪些变量是用于模版的。

============================================================================
FleaPHP 的目录结构
一个典型的 FleaPHP 应用程序具有如下的目录结构:



这个应用程序的目录主要分为 LIBS 和 WEBROOT。其中 LIBS 保存程序的所有代码,而 WEBROOT 目录下只保存用户可以访问的部分,例如 index.php 入口文件、图片、CSS 样式表和 JS 脚本。

LIBS 下又分为 FLEA、SHARED、ADMIN、FRONT 等目录。FLEA 目录保存 FleaPHP 的核心文件,而 SHARED 目录保存应用程序前后台共享的文件、ADMIN 目录保存应用程序后台专有的代码、FRONT 目录保存前台程序专有的代码。开发者在规划目录结构时,可以参照这种方式。

WEBROOT 是保存用户使用浏览器可以直接访问的内容,因此需要修改服务器或虚拟主机设置,将网站的根目录指向 WEBROOT 目录。例如 www.example.com 指向 /example/WEBROOT/。

这里介绍的目录结构有如下优点:

优点:

代码文件放置在浏览器访问不到的地方,提高了安全性
程序员和设计人员可以在不同的目录工作,降低了发生冲突的几率
目录结构更清晰,容易理解
而主要的缺点就是需要修改服务器设置,将网站根目录指向 WEBROOT 目录。而有些虚拟主机不允许这样做,或者需要联系服务器管理员,比较麻烦。

对于这种目录结构,放置在 WEBROOT 中的 index.php 入口文件应该明确调用 FLEA::import() 将 LIBS 目录添加到类定义搜索路径中。否则 FLEA::loadClass() 会找不到需要的文件。

Copy code
<?php
require('../LIBS/FLEA/FLEA.php');
FLEA::import('../LIBS/SHARED/');
....
FLEA::runMVC();

对于虚拟主机用户,可以将 LIBS 目录移动到 WEBROOT 目录中。形成如下的目录结构:



上图中,所有文件都保存在应用程序的根目录 cdhlss 中,而代码文件保存在 LIBS 子目录中。

相应的 index.php 需要修改为:

Copy code
<?php
require('libs/FLEA/FLEA.php');
FLEA::import('LIBS/APP/');
....
FLEA::runMVC();


在实际开发中,由于 FleaPHP 并没有强制要求命名规范和目录结构。所以开发者可以继续沿用自己熟悉的方式来开发应用程序。
顶端 Posted: 2008-03-20 19:00 | 4 楼
jacking

该用户目前不在线
级别: 论坛版主
精华: 2
发帖: 294
威望: 299 点
金钱: 2980 RMB
贡献值: 0 点
注册时间:2007-05-17
最后登录:2008-08-07

FleaPHP 是一个具有高度灵活性的框架。开发者可以用不同的设置来调整 FleaPHP 的工作方式。这些设置统一保存在名为“应用程序设置”的数据源中。

实际上,除了 FleaPHP 框架本身,应用程序也可以使用“应用程序设置”来保存应用程序运行时需要的各种设置。

FleaPHP 的应用程序设置有一个默认配置文件,保存在 FLEA/Config/Default_APP_INF.php 中。应用程序可以在入口文件(例如 index.php)中修改这些设置,以便调整 FleaPHP 的工作方式。

===========================================================================

如何使用应用程序设置?
当 FleaPHP 框架初始化时,默认的应用程序设置文件(Default_APP_INF.php)会被载入。如果应用程序要指定设置,推荐的做法有下列几种:

创建应用程序的私有设置文件
当需要指定多个应用程序设置时,推荐使用该方法。具体的做法非常简单,只需要定义类似如下的文件即可(假设下面的内容保存到文件 APP/Config/MY_APP_INF.php)。

Copy code
<?php
return array(
    'defaultController' => 'UserCenter',
    'urlLowerChar'      => false,
    'dispatcher'        => 'FLEA_Dispatcher_Auth',
    'dbDSN'    => array(
        'driver'        => 'mysql',
        'host'          => 'localhost',
        'login'        => 'root',
        'password'      =>空字符串,
        'database'      => 'test',
    ),
);
?>

然后在应用程序的入口文件 index.php 中调用 FLEA::runMVC() 函数的代码前,增加一行 FLEA::loadAppInf('APP/Config/MY_APP_INF.php') 即可。例如:

Copy code
<?php
require('FLEA/FLEA.php');
FLEA::loadAppInf('APP/Config/MY_APP_INF.php');
FLEA::runMVC();
?>

直接在入口文件中指定设置
对于少量的设置,可以在入口文件中直接用 FLEA::setAppInf() 函数指定。例如:

Copy code
<?php
require('FLEA/FLEA.php');
FLEA::setAppInf('defaultController', 'UserCenter');
FLEA::runMVC();
?>


不管采用哪一种方式,重要的都是必须在 FLEA::runMVC() 之前就指定好应用程序设置。

=====================================================================

默认的应用程序设置
默认的应用程序设置提供了符合常见应用程序运行需要的设置。下面分类列出这些设置的名字和详细说明。

核心配置
namespace 应用程序的默认名字空间,默认值为空字符串
这个设置会影响到应用程序所有类的名称定义。例如 namespace 设置为 FOO 时,应用程序所有控制器、模型的类名字都要加上前缀 FOO_。变成诸如 FOO_Controller_Default、FOO_Model_News 等。

该设置仅用于兼容使用早期FleaPHP开发的应用程序,不建议在新应用程序中使用。

为了让你的代码能够更容易的在其他应用程序中复用,最好将 namespace 设置为空字符串。

controllerAccessor 指示控制器的 URL 参数名,默认值为 controller
这个设置指定在 URL 查询参数中,用什么名字的参数指定控制器名字。例如 controllerAccessor 设置为 “ctl” 时,就必须用 index.php?ctl=MyController 来指定要调用的控制器。

defaultController 指示默认控制器的名字,默认值为 Default
当 url 参数中没有指定要调用的控制器时,将依据 defaultController 的设置调用默认的控制器。

actionAccessor 和 defaultAction,默认值分别为 action 和 index
这两个设置的作用和 controllerAccessor、defaultController 类似。只不过用于指定控制器动作的参数名和默认动作名。

urlMode 指定 URL 分析和构造模式,默认值为 URL_STANDARD
URL 的分析和构造模式,目前支持三种,分别是:URL_STANDARD、URL_PATHINFO 和 URL_REWRITE。

URL_STANDARD 模式中,URL 参数采用采用标准的方式,例如 index.php?controller=MyController&action=MyAction&class_id=2&sort=1

关于 URL_PATHINFO 和 URL_REWRITE 的详细说明,请参考使用 PATHINFO 和 URL 重写。

urlLowerChar 指示是否将 url 参数中包含的控制器名字和动作名字强制转为小写字符,默认值为 false
对于 Windows 系统来说,这个设置无关紧要。而对于 Linux/Unix 系统来说,这个设置会关系到控制器类定义文件的命名。

当 urlLowerChar 为 true 时,控制器名字会被转为小写字符,而该控制器的类名字除第一个字母为大写外,其他全为小写。例如控制器名为 MyController,实际的控制器类名称为 Mycontroller,对应的类定义文件为 Mycontroller.php。

当 urlLowerChar 为 false 时,控制器名字和控制器的类名字完全对应,例如控制器名为 QuickBenchmark,实际的控制器类名称为 QuickBenchmark,对应的类定义文件为 QuickBenchmark.php。

controllerClassPrefix 指示控制器类名称前缀,默认值为 Controller_
actionMethodPrefix 和 actionMethodSuffix 指示控制器动作的方法名要加上的前缀和后缀,默认值分别为 action 和空字符串
使用前缀和后缀可以,让控制器动作方法的名称和控制器中的其他方法区别开来。同时也可以避免无意中造成控制器内的私有方法被浏览器访问到。

dispatcher 指示应用程序要使用的 URL 调度器,默认值为 FLEA_Dispatcher_Simple
URL 调度器分析 URL 参数,决定要调用的控制器和控制器动作方法,最后调用控制器动作方法。默认的 FLEA_Dispatcher_Simple 是一个简单的调度器,仅仅是分析 URL 参数,然后完成调用工作。而更复杂的 FLEA_Dispatcher_Auth 则可以结合 FleaPHP 自带的 RBAC(基于角色的访问控制)组件完成访问控制功能。

如果开发者自己编写了调度器,那么修改这个设置即可让应用程序使用开发者自己编写的调度器。

dispatcherFailedCallback 指示调度器调度失败后,要调用的处理程序,默认值为 null
如果希望应用程序处理调度失败的情况(例如控制器或控制器方法不存在),则需要覆盖这个设置。

Copy code
<?php
FLEA::setAppInf('dispatcherFailedCallback', 'appDispatcherFailedHandler');
?>
internalCacheDir 指示 FleaPHP 内部及 cache 系列函数使用的缓存目录,默认值为 FLEA/_Cache/ 目录
autoLoad 指示要自动载入的文件,默认载入 FLEA_Helper_Array.php、FLEA_Helper_Html.php 和 FLEA_Controller_Action.php 三个文件
这个设置必须是一个数组,数组中每一个项目为要自动载入的文件。

sessionProvider 指示要使用的 session 服务提供程序,默认值为 null
如果设置为 null,则表示使用 PHP 自带的 session 服务。

autoSessionStart 指示是否自动起用 session 支持,默认值为 true
如果该设置为 true,则每次 FleaPHP 框架初始化后都会自动执行 session_start() 函数。

requestFilters 指示使用哪些过滤器对 HTTP 请求进行过滤,默认值为空数组
和 autoLoad 设置类似,该设置必须为数组。但数组中每一个项目为要运行的过滤器类名字。过滤器按照出现在数组中的顺序初始化和运行。

每一个过滤器实际上都是一个脚本,无需要实现为一个类。可以参考 FLEA/Filter/ 目录中的过滤器代码实现自己的过滤器。

FleaPHP 初始化时,会根据 PHP 运行环境设置和应用程序设置来决定是否自动运行 FLEA_Filter_MagicQuotes 和 FLEA_Filter_Uri 过滤器。因此开发者不应该在 requestFilters 设置中调用这两个过滤器。

数据库相关
dbDSN 数据库连接设置,必须是数组,默认值为 null
dbDSN 是 FleaPHP 应用程序默认的数据库连接设置。正确指定该设置后,FleaPHP 会在应用程序需要访问数据库时尝试自动连接数据库。

dbDSN 数组中每个选项的含义如下:

driver 数据库驱动类型,例如 mysql、pgsql 等;
host 数据库所在服务器,通常为 localhost 或 127.0.0.1
port 连接数据库的端口,通常无需指定
login 连接时使用的用户名
password 连接时使用的密码
database 连接后要使用的数据库名
charset 字符集设置,如果没有设置该选项,则以应用程序设置 databaseCharset 为准
options 附加的连接选项
典型的 dbDSN 设置如下:

Copy code
<?php
FLEA::setAppInf('dbDSN',
    array(
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'login'    => 'username',
        'password'  => 'password',
        'database'  => 'test_db',
    )
);
?>
dbTDGAutoInit 指示构造表数据入口对象时,是否自动连接到数据库,默认值为 true
如果你希望自己控制数据库连接,那么可以将该设置指定为 false。

dbTablePrefix 指示数据表的全局前缀,默认为空字符串,该设置会影响到所有数据表
dbValidationProvider 指示表数据入口要使用的数据验证服务对象,默认值为 FLEA_Helper_Validation
视图和模版相关
view 指示要使用的模板引擎,PHP 表示使用 PHP 语言本身作模板引擎,默认值为 PHP
目前 FleaPHP 提供了 FLEA_View_Simple 模版引擎和 FLEA_View_Smarty 模版引擎。其中 FLEA_View_Smarty 实际上是一个连接器,用于连接 Smarty 模版引擎。

viewConfig 指定模板引擎要使用的配置信息,默认为 null
不同模版引擎可能需要不同的配置,可以用 viewConfig 设置来指定。

I18N
有关 FleaPHP 对 I18N 支持的详细信息,请参考开发指南的相关章节。

responseCharset 指示 FleaPHP 输出内容的使用的编码,默认值为 gb2312
FleaPHP 核心本身并不假定要处理的内容采用什么编码,也不会自动将输入内容转换为输出内容指定的编码。responseCharset 设置仅仅是用来作为一个参考,特别是 autoResponseHeader 设置为 true 时,FleaPHP 会自动送出 Content-Type: text/html; charset=xxxxx 的 HTTP 头信息。

databaseCharset 指示当 FleaPHP 连接数据库时,要指定的编码,默认值为 gb2312
许多较为高级的数据库,例如 PostgreSQL、MySQL 4.1/5.x、Oracle 等,都允许在数据库中保存不同编码的数据。因此开发者要正确设置 databaseCharset 设置,以便 FleaPHP 在连接数据库时能够正确设置编码,避免乱码问题。

对于较老的数据库,例如 MySQL 3.x/4.0,这个设置没有意义。

autoResponseHeader 指示是否自动输出 Content-Type: text/html; charset=xxxxx 的 HTTP 头信息,默认值为 true
当该设置为 true 时,FleaPHP 会在初始化时自动输出一个 HTTP 头信息,以指定应用程序输出内容的编码。具体指定什么编码,由 responseCharset 设置决定。

对于大部分服务器,启用该设置可以避免出现浏览器无法正确识别输出内容编码的问题。但在某些服务器环境中,启用该设置会导致出现无法输出动态图像等问题。

charsetConstant 指示是否自动定义 RESPONSE_CHARSET、DATABASE_CHARSET 等常量,默认值为 true
当该设置为 true 时,FleaPHP 会在初始化时根据 responseCharset 和 databaseCharset 设置分别定义 RESPONSE_CHARSET 和 DATABASE_CHARSET 常量。应用程序可以用这两个常量简化一些开发。

multiLangaugeSupport 指示是否启用多语言支持,默认值为 false
当该设置为 true 时,会自动载入由 languageSupportProvider 指定的多语言支持服务提供程序。

languageSupportProvider 指定提供多语言支持的提供程序,默认值为 FLEA_Com_Language
FLEA_Com_Language 是 FleaPHP 自带的多语言支持服务提供程序。

languageFilesDir 指示语言文件的保存位置,默认值为 null
当使用多语言支持时,必须修改该设置,指向一个保存所有语言文件的目录。

语言文件按照“语言/字典名.php”的目录结构存储,例如 languageFilesDir 设置为 /var/www/test/languages,则语言文件的实际文件名就可能是:/var/www/test/languages/chinese-gb2312/user_interface.php。

defaultLanguage 指示默认语言,默认值为 chinese-gb2312
当载入语言文件时如果没有指定语言参数,则会从 defaultLanguage 指定的语言目录下载入字典文件。

autoLoadLanguage 指示要自动载入的语言字典,默认值为 null
autoLoadLanguage 可以是数组,其中每一项是一个要载入的字典名。或者是一个用“,”分隔多个字典名的字符串。

FLEA_Dispatcher_Auth 和 RBAC 组件
dispatcherAuthProvider 指示调度器要使用的验证服务提供程序,默认值为 FLEA_Com_RBAC
FLEA_Com_RBAC 提供了 check() 方法,让调度器通过调用该方法来检查当前发起请求的用户是否有权限访问指定的控制器和控制器动作方法。如果开发者要编写自己的验证服务提供程序,就必须实现 check() 方法。如果使用开发者自己编写的调度器,也可以通过该设置来指定验证服务提供程序。

check() 方法的原型是:function check($roles, $ACT)

defaultControllerACTFile 指示 RBAC 组件要使用的默认 ACT 文件,默认值为空字符串
通过该设置,可以为多个控制器指定 ACT(访问控制表),而不需要为每一个控制器都提供一个 .act.php 文件。注意,该设置指定的文件必须是完整路径,或者相对于应用程序入口(index.php)的相对路径。

autoQueryDefaultACTFile 指示 RBAC 组件是否在没有找到控制器的 ACT 文件时,是否从默认 ACT 文件中查询控制器的 ACT,默认值为 false
controllerACTLoadWarning 指示没有找到控制器的 ACT 时,是否显示警告信息,默认值为 true
defaultControllerACT 指示当没有为控制器提供 ACT 时,要使用的默认 ACT,默认值为 null
dispatcherAuthFailedCallback 指示用户没有权限访问控制器或控制器方法时,要调用的处理程序,默认值为 null
RBACSessionKey 指示 RBAC 组件用什么键名在 session 中保存用户数据,默认值为 RBAC_USERDATA
如果在一个域名下同时运行多个应用程序,请务必为每一个应用程序使用自己独一无二的键名。

日志服务和错误处理
logEnabled 指示是否启用日志服务,默认值为 false
如果该设置为 true,则会自动载入由 logProvider 设置指定的日志服务提供程序。

logProvider 指示日志服务的程序,默认值为 FLEA_Com_Log
logFileDir 指示用什么目录保存日志文件,默认值为 null
最好将日志保存在浏览器无法访问的目录中。

logFilename 指示用什么文件名保存日志,默认值为 access.log
logFileMaxSize 指示当日志文件超过多少 KB 时,自动创建新的日志文件,单位是 KB,不能小于 512KB,默认值为 4096
logErrorLevel 指示哪些级别的错误要保存到日志中,默认值为 ‚warning, error, exception‘
displayErrors 指示是否显示错误信息,默认值为 true
friendlyErrorsMessage 指示是否显示友好的错误信息,默认值为 true
顶端 Posted: 2008-03-20 19:01 | 5 楼
jacking

该用户目前不在线
级别: 论坛版主
精华: 2
发帖: 294
威望: 299 点
金钱: 2980 RMB
贡献值: 0 点
注册时间:2007-05-17
最后登录:2008-08-07

这一章我们就来看看 FleaPHP 的数据库访问功能。体验一下 FleaPHP 出色的自动化 CRUD 能力。

=========================================================================、

连接数据库
在 htdocs 目录中创建子目录 testDB,并在子目录下创建文件 test1.php 文件,内容如下:

Copy code
<?php

require('../FLEA/FLEA.php');
FLEA::init();

// 准备数据库连接信息
$dsn = array(
    'driver'        => 'mysql',
    'host'          => 'localhost',
    'login'        => 'root',
    'password'      => '',
    'database'      => 'test',
);

// 获取数据库访问对象
$dbo =& FLEA::getDBO($dsn);

// 连接到数据库
if ($dbo->connect()) {
    echo 'Connect to database successed.';
}

?>

请注意这里我们没有调用 run() 函数。因此我们需要调用 FLEA::init() 函数来初始化 FleaPHP 运行环境。并且 FLEA::init() 函数应该在用 register_app_inf() 或 set_app_inf() 修改应用程序设置后调用。

现在启动 APM Express,通过浏览器执行 http://localhost/testDB/test1.php,如果一切正常,应该看到 Connect to database successed 信息。

如果出现如下的错误信息,说明 MySQL 数据库的 root 用户密码不正确。请修改上面代码中的 password 信息。

Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root'@'localhost'
--------------------------------------------------------------------------------



创建记录
接下来,我们用 phpMyAdmin 在 test 数据库中执行下面的 SQL 语句。这会创建在 test 数据库中创建一个名为 posts 的表。

Copy code
CREATE TABLE `posts` (
  `post_id` int(11) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL,
  `body` text NOT NULL,
  `created` int(11) default NULL,
  `updated` int(11) default NULL,
  PRIMARY KEY  (`post_id`)
);现在我们修改 test1.php 的内容为以下内容:

<?php

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

// 准备数据库连接信息
$dsn = array(
    'driver'        => 'mysql',
    'host'          => 'localhost',
    'login'        => 'root',
    'password'      => '',
    'database'      => 'test',
);
// 指定数据库连接设置,TableDataGateway 会自动取出 dbDSN 设置来连接数据库
set_app_inf('dbDSN', $dsn);

// 初始化 FleaPHP 运行环境
FLEA::init();

// 由于 FLEA_Db_TableDataGateway 并不是自动载入的,因此需要明确载入
FLEA::loadClass('FLEA_Db_TableDataGateway');

// 从 FLEA_Db_TableDataGateway 派生 Posts 类
class Posts extends FLEA_Db_TableDataGateway
{
    // 指定数据表名称
    var $tableName = 'posts';
    // 指定主键字段名
    var $primaryKey = 'post_id';
}

// 构造 Posts 实例
$modelPosts =& new Posts();
// 创建一条新记录,并返回新记录的主键值
$row = array(
    'title' => 'First post',
    'body'  => 'First post body',
);
$newPostId = $modelPosts->create($row);
echo $newPostId;

?>

在浏览器重新运行 test1.php,会看到输出结果 1。如果多刷新几次,可以看到这个数字不断增长。现在转到 phpMyAdmin,浏览 posts 表,会发现这个表已经插入了数据。




注意上图中划红圈的 created 字段。虽然我们上面的代码在用 $modelPosts->create() 插入记录时并没有提供该字段的值,但该字段的值被自动填充了。

当数据表中具有名为 created、created_at 或 created_on 的字段,并且字段类型为整数或日期,则在向这个数据表插入记录时。FleaPHP 会自动用当前时间填充该字段。同样的,updated、updated_at 或 updated_on 字段会在更新记录时用当前时间填充。

关于 FLEA_Db_TableDataGateway
FLEA_Db_TableDataGateway 是一个提供自动化 CRUD 操作的类。开发者必须从该类派生自己的类。每一个 FLEA_Db_TableDataGateway 派生类对应一个数据表。例如上面代码中的 Posts 类就对应数据表 posts。FLEA_Db_TableDataGateway 派生类在 FleaPHP 应用程序中称为表数据入口。

每一个表数据入口都需要定义一个必须的成员变量:

$tableName 指定该表数据入口对应的数据表
如果数据表有多个主键字段,那么还要用 $primaryKey 指定要使用的主键字段。当没有用 $primaryKey 指定时,FLEA_Db_TableDataGateway 会自动根据数据表定义来确定主键字段名。

完成上面的定义后,一个表数据入口类就准备好了。只要实例化这个类,就能对该类对应的数据表进行各种操作了。

===================================================================

读取和更新记录
现在我们继续修改前面的代码,增加如下内容:

Copy code
/**
* .... 接续上面的代码片段
*/

echo "<hr />\n";
// 读取刚刚创建的新记录
$post = $modelPosts->find($newPostId);
// 输出记录内容
dump($post);

// 修改记录内容
$post['title'] = 'New title';
// 保存修改后的记录到数据库
$modelPosts->update($post);

// 重新查询被修改后的记录
$updatedPost = $modelPosts->find($newPostId);
// 输出修改后的记录内容
dump($updatedPost);

现在通过浏览器执行 test1.php,就可以看到两个稍有不同的输出。

第一段输出是用 $modelPosts->find() 取出的记录内容。而第二段数据是用 $modelPosts->update() 更新后再取出的记录内容。



对比两段输出,可以看到第二段输出的 title 字段和 updated 字段都被修改了。

======================================================================

删除记录
删除记录有两种主要的方式,一是用表数据入口的 remove() 方法,以一条记录做参数。另一种方法是用 removeByPkv() 方法,以记录的主键值做参数。

// 取出所有 title 字段值为 'First post' 的记录
$posts = $modelPosts->findAll(array('title' => 'First post'));
// 删除这些记录
foreach ($posts as $post) {
    $modelPosts->remove($post);
    // 或者使用
    // $modelPosts->removeByPkv($post[$modelPosts->primaryKey]);
}这个章节里面,我们粗略的看了一下 FleaPHP 提供的表数据入口提供的基本操作。在后续章节里面,我们会看到表数据入口的其他强大功能。
顶端 Posted: 2008-03-20 19:06 | 6 楼
jacking

该用户目前不在线
级别: 论坛版主
精华: 2
发帖: 294
威望: 299 点
金钱: 2980 RMB
贡献值: 0 点
注册时间:2007-05-17
最后登录:2008-08-07

数据表关联是指两个或者多个数据表的记录之间的逻辑关系。

例如:

每一个公民都有一个身份证号码
每一位作者都写了多本(0-n)书籍,而每一本书籍都有多个(1-n)作者
每一篇文章都有多个(0-n)评论
每一个评论都属于一篇文章
目前,FleaPHP 支持四种类型的数据表关联,分别是:

HAS_ONE: 当前表的每一条记录都拥有最多一条(0–1)关联记录
HAS_MANY: 当前表的每一条记录都拥有多条(0-n)关联记录
MANY_TO_MANY: 当前表的每一条记录都和其他表的多条(0-n)记录关联
BELONGS_TO: 当前表的每一条记录都属于另一个表的某条记录
在 FleaPHP 中,可以为每一个表数据入口定义多个不同的关联,例如:

Copy code
<?php

FLEA::loadClass('FLEA_Db_TableDataGateway');

class Model_ProductClass extends FLEA_Db_TableDataGateway
{
    var $tableName = 'product_class';
    var $primaryKey = 'pclass_id';

    var $hasMany = array(
        array(
            'tableClass' => 'Model_Permissions',
            'foreignKey' => 'pclass_id',
            'mappingName' => 'permissions',
        ),
        array(
            'tableClass' => 'Model_Products',
            'foreignKey' => 'pclass_id',
            'mappingName' => 'products',
            'enabled' => false,
        ),
    );
    var $hasOne = array(
        array(
            'tableClass' => 'Model_ProductClassAdverts',
            'foreignKey' => 'pclass_id',
            'mappingName' => 'advert',
        )
    );
}

?>


==========================================================================
术语
在详细介绍这四种关联之前,先了解一些后文将会用到的术语。

关联: 一个关联是一个关系,这个关系属于某一个数据表。例如 users 表可能就拥有一个或者多个关联。
主表: 对于一个关联,拥有该关联的数据表就是主表。例如 posts 表定义了一个 MANY_TO_MANY 关联。那么在这里(指这个关联),posts 就是主表。
关联表: 在一个关联中,关联表就是除主表外的另一个表。
外键: 在数据库原理中,外键的含义很复杂。但在 FleaPHP 框架中的数据库关联功能中,外键泛指一个记录中用于关联另一个记录的字段。例如 profile 表中的 user_id 字段就是用于关联 users 表的字段。这个 user_id 字段就是一个外键。
中间表: 在 MANY_TO_MANY 关联中,除了主表和关联表,还需要另一个表来保存这两个表的记录之间的互相关联关系。这个表称为中间表。
理解这几个术语后,我们再来看每一种关联的详细解释。


=======================================================================

HAS_ONE 一对一关联
HAS_ONE 是一种非常简单的关联关系。表示一个记录拥有另一个记录。这两个记录分别位于两个数据表中。

示例
在一个信息管理系统中,users 表用于存储用户帐户的基本信息,例如用户名、密码等。而 profiles 表则用于存储用户的个人信息,例如家庭住址、邮政编码等。

由于每一个用户(一条 users 表中的记录)都有一份对应的个人信息(一条 profiles 表中的记录)。因此,我们就可以为 users 表定义一个 HAS_ONE 关联。

很明显,users 表的记录拥有一条 profiles 表的记录。因此,当 users 表中的一条记录被删除时,被删除记录所拥有的 profiles 表中的关联记录也会被自动删除。

表定义
在 HAS_ONE 关联中,要求外键放置在关联表中。

上述例子的表定义简化版如下:

Copy code
users 表:

user_id 主键字段
username
profiles 表:

profile_id 主键字段
address
postcode
user_id 外键字段
对应的 MySQL 代码如下:

CREATE TABLE `users` (
    `user_id` INT NOT NULL AUTO_INCREMENT ,
    `username` VARCHAR( 32 ) NOT NULL ,
    PRIMARY KEY ( `user_id` )
);

CREATE TABLE `profiles` (
    `profile_id` INT NOT NULL AUTO_INCREMENT ,
    `address` VARCHAR( 128 ) NOT NULL ,
    `postcode` VARCHAR( 8 ) NOT NULL ,
    `user_id` INT NOT NULL ,
    PRIMARY KEY ( `profile_id` )
);对应的 FLEA_Db_TableDataGateway 继承类的定义如下:

<?php

FLEA::loadClass('FLEA_Db_TableDataGateway');

class Users extends FLEA_Db_TableDataGateway
{
    var $tableName = 'users';
    var $primaryKey = 'user_id';

    var $hasOne = array(
        'tableClass' => 'Profiles',
        'foreignKey' => 'user_id',
        'mappingName' => 'profile',
    );
}

class Profiles extends FLEA_Db_TableDataGateway
{
    var $tableName = 'profiles';
    var $primaryKey = 'profile_id';
}

?>演示代码
<?php

// 首先插入一条 users 记录
$modelUsers =& new Users();
$row = array('username' => 'dualface');
$newUserId = $modelUsers->create($row);

// 接下来,再插入一条 profiles 记录
$modelProfiles =& new Profiles();
$row = array(
    'address' => 'SiChuan ZiGong',
    'postcode' => '643000',
    'user_id' => $newUserId
);
$modelProfiles->create($row);

// OK,我们现在尝试读取一条 users 记录,看看会得到什么结果
$user = $modelUsers->find($newUserId);
dump($user);

?>

结果很有趣,多出来的 ‘profile’ 字段正好是我们刚刚插入 profiles 表的记录内容:

Copy code
Array
(
    [user_id] => 1
    [username] => dualface
    [ref___id] => 1
    [profile] => Array
        (
            [profile_id] => 1
            [address] => SiChuan ZiGong
            [postcode] => 643000
            [user_id] => 1
            [ref___id] => 1
        )
)

说明
在上面的例子中,Users 类中有一个 $hasOne 成员变量。该变量为一个数组:

Copy code
var $hasOne = array(
    'tableClass' => 'Profiles',
    'foreignKey' => 'user_id',
    'mappingName' => 'profile',
);

$hasOne 成员变量用于为一个表数据库入口指定 HAS_ONE 关联。

在关联的定义中,tableClass 指定关联表的表数据入口类名称,foreignKey 指定外键字段名,而 mappingName 则指定在主表的查询结果中用什么字段映射关联表的数据。
顶端 Posted: 2008-03-20 19:09 | 7 楼
cdzqjy

该用户目前不在线
级别: 新手上路
精华: 0
发帖: 13
威望: 14 点
金钱: 130 RMB
贡献值: 0 点
注册时间:2008-05-16
最后登录:2008-07-19

顶端 Posted: 2008-06-27 15:42 | 8 楼
cdzqjy

该用户目前不在线
级别: 新手上路
精华: 0
发帖: 13
威望: 14 点
金钱: 130 RMB
贡献值: 0 点
注册时间:2008-05-16
最后登录:2008-07-19

中嵌教育打造一流的嵌入式技术,
周末可预约免费视听席位
◆      报名电话:400-702 8848          800-702 8848
◆  联 系 人:李老师      在线咨询QQ:921039873   
◆  报名地点:成都市科华北路47号(川大科技大厦)606室
◆  公司网站:  http://WWW.ChinaEDA.CN (中嵌教育)
            http://WWW.ChinaEDAJOB.CN (中嵌人才网)
顶端 Posted: 2008-06-27 15:45 | 9 楼
开源嘛论坛 » 程序推荐

Guest cache page, Update at 2008-12-02 16:57 桂ICP备07006725号
Powered by PHPWind v6.0 Certificate Code © 2003-07 PHPWind.com Corporation