[PHP] Hush-Framework in Action

Hush Framework(以下简称 HF)是一个基于 ZendFramework 和 Smarty 的强大的面向企业应用的 PHP 框架,Google Code 上的项目地址为:http://code.google.com/p/hush-framework/ ,有兴趣的朋友可以看看,本次 Update 除了上次介绍的 HF 一些功能点外(参考上篇文章:《[PHP] 新的里程碑 Hush Framework 》),添加了对 Bpm 企业工作流控制的支持以及关于 PHP 多进程 / 消息处理 的模块,力求把 PHP 的潜力发挥到最大~ 关于 Bpm 方向大家可以参考子项目 PBPM;关于 PHP 消息处理方向,我还开辟了一个子项目:PMS Framework(http://code.google.com/p/pms-framework/),下期我会专门找时间介绍一下这个消息队列处理系统。

目前这三个项目都在不断的完善中,有兴趣加入以上项目的朋友可以和我联系,本人的邮件地址见本文最后。

以下是关于 HF 一些安装和使用说明:

1、下载与安装:

介绍安装过程之前先介绍一下 HF 的大体结构,代码包括三大部分:
hush-app:HF 应用框架,支持 RBAC 和 BPM 的强大企业级框架
hush-lib:HF 基础框架,hush-app 应用框架的基础,基于 ZendFramework 和 Smarty
hush-pms:(Message Queue Server) 可参考 PMS Framework 项目

首先,通过 svn 下载源码:
svn checkout http ://hush-framework.googlecode.com/svn/trunk/ hush-framework-read-only
另外本库需要 ZendFramework 以及 Smarty 的库可以从以下地址下载:
http://code.google.com/p/hush-framework/downloads/list
下载后解压到本地的 /path/to/phplibs(目录由你自己决定) 下。
接着修改 hush-app/etc/global.config.php 配置文件:
...
/**
 * Common libraries paths
 * TODO : Copy Zend Framework and Smarty libraries to this path !!!
 */
define('__COMM_LIB_DIR', /path/to/phplibs);
...
以上是全局配置,至于前后台的具体配置,大家可以分别参考 hush-app/etc/frontend.config.php 和 hush-app/etc/backend.config.php 配置文件。

接下来,修改 hush-app/etc/database.ihush_core.ini 以及 hush-app/etc/database.ihush_apps.ini 的数据库配置,保证数据库服务器用户名/密码正确,如果你的后台数据库是读写分离的,也可以在配置文件中分别配置读库和写库的配置信息。

然后,命令行进入 hush-app/bin 目录,运行 hush 命令,可以看到如下画面:

[PHP] Hush-Framework in Action_第1张图片

以上的图有点老了,以下是新的命令:

hush sys init                                        初始化 hush 运行环境(仅首次运行用,数据库配置请在 hush-app/etc/database.mysql.php 文件中配置)
hush db [backup|recover] <...>         备份数据库,支持备份&恢复任何一个分布式的数据库
hush check [dir|configs]                     检查系统 [ 目录 | 配置 ] 的正确性
hush check all                                     检查整个框架的正确性
hush clean tpl [fe|be] [tplc|cache]     清除 [ 前台 | 后台 ] 的Smarty模板中的 [ 临时模板 | 模板缓存 ] 的文件
hush clean cache [fe|be]                   清除 [ 前台 | 后台 ] 的本地缓存文件
hush clean all                                      清除模板和缓存的全部内容

在这里,我们运行 hush init 命令开始初始化 HF 的运行环境,选择 Y 后,系统会自动导入初始数据库,建立运行时必要的目录,并清除所有老的缓存数据。

运行完毕后,我们最后只需要配置一下 Apache 服务器的前后台 VirtualHost 分别到 hush-app/web/frontend 和 hush-app/web/backend 目录下,就可以了。Apache 会自动根据 .htaccess 文件做 URL 重写,如果是其他的服务器(例如 Nginx)请把对应 VirtualHost 的所有请求转发至 index.php。

访问前台 URL 地址,效果如下图:

[PHP] Hush-Framework in Action_第2张图片

访问后台 URL 地址:使用默认超级用户名/密码 sa/sa 登录,截图如下:

[PHP] Hush-Framework in Action_第3张图片

如果您能看到如上界面,那么恭喜您安装成功,接下来就开始您的 HF 之旅吧~

2、HF 开发参考:

本框架已经为使用者准备好完善的 MVC 结构,对应的类代码可以分别在以下类目录下看到:
M :hush-app/lib/Ihush/Dao (数据库操作类,按库名分开)
V :hush-app/tpl/frontend/template 和 hush-app/tpl/backend/template (分别对应前后台)
C :hush-app/lib/Ihush/App/Frontend 和 hush-app/lib/Ihush/App/Backend (分别对应前后台)
这里需要注意的是:传统的 Controller 我们这里叫 Page,比如 hush-app/lib/Ihush/App/Backend/Page/AclPage.php 就是对应 URL 地址为 /acl/* 的控制器,我们这里的 Controller 类是以 Page 为后缀的原因是 HF 框架不仅支持 MVC 结构的应用,也支持传统的基于页面的 PHP 程序结构,大家可以参考 hush-app/web/frontend/app/index.php (对应 URL 为 /app/index.php) 的类代码。

至于 Mapping 配置文件,大家可以参考 hush-app/etc/frontend.mapping.ini 和 hush-app/etc/backend.mapping.ini 文件,这就是 HF 的 URL Router 大大快于 ZF 的秘密了,我们支持用配置文件直接匹配 URL 与 Controller 的关系,示例如下:
/test/mapping       = TestPage::mappingAction
/test/p/*               = TestPage::pagingAction
/test/*                  = TestPage::indexAction

然后这里重点介绍一下后台的 RBAC 的可扩展的权限管理系统,这个系统应该是传统 ERP 系统中最终要的部分之一,当然也应该可以算的上是 HF 中最核心的部分之一了,我们来看看如何使用和扩展这个核心权限系统吧。首先必须了解这个系统是包括:角色管理,用户管理,资源管理和菜单管理四个部分。

我们打开后台地址,使用 sa 帐户登陆后,可以根据自己的需求来添加角色,系统默认有超级管理员(SA)、普通管理员(AM)、客服人员(CS)、物流人员(LS)、财务人员(FS)五个角色,当然在实际运用中我们还加入了客服主管、物流主管以及财务主管等各层次的角色以满足公司内部更细致的权限控制要求。然后,我们可以通过设置角色的权限来控制每个角色可操作的其他角色,比如超级管理员拥有所其他所有角色的操作权限,而普通管理员则拥有对客服人员、物流人员、财务人员的管理权限。这样一个系统内部最核心的角色权限关系就被定义好了(程序使用的时候该关系会被 Cache 起来以供系统调用)。

然后我们就可以通过用户管理来添加和修改每个用户的角色(一个用户可以有多个角色),最后就是给资源和菜单设置权限了。关于资源的概念大家可以去参考以下 ACL 的设计原则,其实简单点说,资源就是就是用户/角色可以操作的权限实体,菜单(我们把每个菜单对应的页面称为应用)是比较传统的一个说法,而对于 HF 的 ACL 来说,实际上是一种特殊的资源,我们可以控制每个菜单的权限来限定是有特定角色的用户才可以操作该菜单下的应用,让后通过设置更细节的资源来控制应用中的细节的权限,这样子就构成了一个比较完善的后台权限管理框架,菜单管理的操作界面如下图:

[PHP] Hush-Framework in Action_第4张图片

而开发者使用起来也很简单,HF 在程序代码中我们提供一个 acl 对象,只要使用其中的 isAllowed 方法就可以很方便的判断用户的角色列表是否对相应的资源有效,甚至在 Smarty 模板中我们也可以很方便的进行权限的判断工作。这样子就大大地减少了这部分繁琐的权限控制代码了,赶快来尝试一下吧~

另外,本框架还集成了一个 BPM 的工作流系统,也是 PBPM 项目(http://code.google.com/p/pbpm/)的主要内容,目前已经可以支持通过手动配置流程图来实现可编程的企业流程管理(内嵌类 PHP 语言 PBEL),这应该是 PHP 在这个领域的“先行者”了吧,有兴趣的朋友千万不能错过哦,后面我也会找时间详细介绍一下这个系统,先预览一下系统截图:

[PHP] Hush-Framework in Action_第5张图片

接下来,对于 hush-lib 下的 HF 类库,我做一个简单的说明如下,详细的大家请下载文档查阅:

Hush_Acl:ACL 权限管理包
Hush_App:App 基类包,主要用户开使整个 webapp 的逻辑。
Hush_Auth:登录验证类包,参考 Zend_Auth
Hush_Bpm:BPM 流程管理类库,包含 Pbel 语言引擎
Hush_Cache:缓存类包,参考 Zend_Cache
Hush_Chart:图表类包
Hush_Crypt:加密类库,支持 Rsa
Hush_Date:时间类包,参考 Zend_Date
Hush_Db:数据库操作类包(MVC 中的 M),参考 Zend_Db
Hush_Debug:调试类包
Hush_Exception:异常类包
Hush_Html:Html 类库,可用于构建 Form
Hush_Http:Http 操作类包
Hush_Json:参考 Zend_Json
Hush_Mail:邮件控制类包
Hush_Message:消息处理类包
Hush_Page:页面类(MVC 中的 C)
Hush_Paging:分页类
Hush_Process:进程类包
Hush_Session:参考 Zend_Session
Hush_Socket:Socket 处理类包
Hush_Tree:数型结构处理类
Hush_Util:常用工具类
Hush_View:页面显示类包(MVC 中的 V)

至于以上类库具体的使用,大家可以参考 hush-app 的源码,另外可以参考 hush-lib/Examples 下的几个例子:包含一个多进程的例子,一个消息处理类,一个 Socket Server/Client 的例子,以及一个多进程 C/S 结构的实例,均可直接使用 cli 方式运行,当然首先您需要根据提示打开一些必要的 PHP 扩展,如果有问的话题可以和我联系~

关于分页类使用“特别说明”:

这段时间从某些朋友的留言中可以看出大家可能对 Hush Framework 的分页类的使用有一些疑惑,因此我在这里特别说明一下这个部分的用法(大家也可以参考 hush-app/lib/Ihush/App/Frontend/Page/TestPage.php 中的 pagingDemo 方法中的说明,使用说明已经 checkin),另外也请大家更新一下 Hush Framework 的代码。本分页类的实用方式其实比 Zend Paginator 简单很多,用户直接可以使用分页类的 toArray() 方法把分页结果的数组直接提供给 Smarty 等模板直接展示,非常方便!另外,本分页类的一大亮点就是:本分页类与 DB 层没有任何耦合,大家完全可以更据不同需求灵活运用,也不存在大数据量下 count 效率的问题,具体大家请看下面的使用说明。

从比较全面的角度考虑,本框架的分页支持三种方式:
1、构造函数的第一个参数是数组:针对普通数组的分页,也就是 TestPage.php 中 pagingDemo Action 的使用,如果需要分页的数据是现成的话,建议使用这种简单方式。
2、构造函数的第一个参数是数字:常在 DAO 类中使用,参数表示查询出的总数,然后可使用分页类中的 frNum 和 toNum 数值结合 MySQL 的 limit 使用。举例如下:
...
$sql = $this->dbr()->select()... // 查找语句
$page = new Ihush_Paging($totalNumber, $eachPageNumber, $thisPageNumber, array(...));
$sql->limit($page->frNum, $page->toNum); // 结合 Limit 分页
...
当然如果你要使用 Zend Db 自带的 limitPage 方法也是可以的,具体的实例见:hush-app/lib/Ihush/Dao/Core/BpmRequest.php 中的 getSendByPage() 方法的用法。
3、构造函数的第一个参数为空:这种方式经常用在后台数据量爆大的情况,由于不需要传入 count 总数,也避免了大数量的情况下出现的 count 的效率问题,大家可以灵活运用。

另外,Ihush_Paging 类四个参数的解释说明如下:

参数1:具体用法见本方法前面的“特别说明”。
参数2:每页包含的数据项个数。
参数3:页码数,空则表示首页。
参数4:分页模式,目前支持的 Mode 有三种,分别是 Google、Common、JavaEye 的分页模式。

最后,欢迎有兴趣加入的朋友或者有好的建议的朋友和我联系,我的邮件地址为:shagoo#gmail.com (# 替换成 @),希望我们的努力让 HF 和 PMS 能给 PHP 的发展贡献一份微薄的力量~


原文链接: http://blog.csdn.net/shagoo/article/details/5655539

你可能感兴趣的:([PHP] Hush-Framework in Action)