转载

grape动态PHP结构(二)——管理后台

一、概述

1) indexController.php 中写了些简短的demo,引用dao层、调用rpc、测试调用等。

2) publicController.php 中记录的是不需要登录的操作,目前是登录与退出操作。 public/login 是登录地址,用户名是 admin,密码是 123456

3) userController.php 做了列表( user/lists )和表单( user/add )页面的demo,就是下图中的用户列表和添加用户

4)如上图的目录结构所示, library/dao 中,编写了一些数据操作的demo,可满足简单的增删改查

5)如上图的目录结构所示, library/helper/dict 中,放置了些静态常量和数据字典,例如ajax请求状态码、api中不需要登录的页面、后台不需登录的地址等

二、入口文件

入口文件都放在public文件夹下面,静态资源也放在这个位置,后台管理在admin中,静态效果可参考 grape-skin 的文档。

三、app文件,视图与控制器

1)conf,配置

conf中配置了站点URL,控制器文件后缀名、Action函数名称后缀、module白名单等参数,拦截器配置。这几个配置都是根据InitPHP设置的, 点击查看InitPHP配置

/**  * 站点URL配置  * 必选参数  */ $InitPHP_conf['url'] = 'http://admin.grape.net/';

2)controller,控制器

由于是后台管理,所以我就没用模块了,控制器文件都是直接在controller文件夹下面。 可参考InitPHP中的Controller控制层使用

1.控制器都会继承 adminController 类,在这个类中做了些请求验证、不同的模版设置,ajax返回数据统一结构,分页代码配置,通用功能方法,session保存等

2.对于传过来的参数都会做些验证, 查看InitPHP安全基础

protected function p($key, $isfilter=true, $type=null) {      return $this->controller->get_gp($key, $type, $isfilter); }

3.只有在 $initphp_list 数组中设置了的,才算是一个action,才可通过域名访问

4.验证包括post请求做限制判断、CSRF风险控制与登录验证等

5.左边菜单可以做权限设置,我现在这边是写死的,菜单字典写在了 library/helper/dict/enumHelper 中的 $admin_menu

6. widgetController.php 文件中可以放置一些脚本插件的服务器逻辑,例如编辑器中图片上传,普通的图片上传。顺便说下图片我是单独做了张 bc_image 表,上传的图片都会记录到这张表中

Controller类的大致代码如下:

/**  * 不需要登录的操作  * @author pwstrick  *  */ class publicController extends adminController {     /**      * action列表      */     public $initphp_list = array('login', 'ajaxlogin', 'logout');          /**      * 登录      * @author pwstrick      */     public function login() {         $this->publicTemplate('登录');         $this->view->display('public/login');     } }

3)template,视图

这里是放视图文件的,视图也根据了InitPHP的规则, 查看InitPHP视图文档

1. layout 中,放的是模版文件,目前是有三套模版,每个模版分为header和footer,不需要登录的、需要登录的和弹出层的页面

2. public 是摆放未登录的,目前就一个login登录

3. comform.htm 是用来展示php编写表单的视图,也就是用php来写html代码。form.htm中只有一个变量,用于echo的。

4.php编写html代码,文件主要放在 formHelperadminHelper 中,顺便说下 adminHelper 会在 adminController 的特定条件下引入,formHelper是根据 CI中的form_helper代码 改写的,封装了些常规标签如p、span、select等,也封装了些grap-skin中的美化控件,以及一些第三方脚本插件,具体可以查看代码

5.如上图的目录结构,helper中的view文件夹下放的就是php编写html代码,在里面写了两个demo,引用的话如下:

InitPHP::getHelper('view/user');

6.大部分规则页面就可以通过php代码来编写控件,但有些特殊页面不能这么来了,这个时候可以把html代码直接写在视图中,例如 user 文件夹下的 layer.htm

4)data,动态可写文件目录

1.filecache:文件缓存目录

2.template_c:视图文件经过一次编译后,变成php后缀的文件,保存在这里

5)interceptor,拦截器

拦截器中我做了个简单的demo, 查看InitPHP拦截器的文档

在里面我就做了个性能分析的记录,仅作演示。

/**  * 前置拦截器,在所有Action运行全会进行拦截  * 如果返回true,则拦截通过;如果返回false,则拦截  * @return boolean 返回布尔类型,如果返回false,则截断  */ public function preHandle() {  $config = InitPHP::getConfig();  if($config['is_xhprof']) {   xhprof_enable();  }  return true; } /**  * 后置拦截器,在所有操作进行完毕之后进行拦截  */ public function postHandle() {  $config = InitPHP::getConfig();  if($config['is_xhprof']) {   $xhprof_data = xhprof_disable();   $xhprof_runs = new XHProfRuns_Default();   $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");  } } 

四、initphp库文件修改

1)initphp.php:

初始化的时候自动载入了部分文件

self::_autoload();//加载必须的文件

新增了几个dao层引用函数如下

/**  * 引入mongo的dao数据  */ public static function getMongoDao($daoname, $path = 'mongo') {     return self::getDao($daoname, $path); } /**  * 引入cache的dao数据  */ public static function getCacheDao($daoname, $path = 'cache') {     return self::getDao($daoname, $path); } /**  * 引入mysql的dao数据  */ public static function getMysqlDao($daoname, $path = 'mysql') {     return self::getDao($daoname, $path); } /**  * 引入全文检索的dao数据  */ public static function getSearchDao($daoname, $path = 'search') {     return self::getDao($daoname, $path); } 

Dao基类的初始化也做了修改修改,代码如下:

/**  * 初始化  */ public function __construct() {  $this->dao = $this->load('dao', 'd'); //导入D  $this->dao->run_db(); //初始化db  $this->dao->run_cache(); //初始化cahce  $this->dao->run_nosql(); //初始化nosql 默认是mongoDB  $this->dao->run_search(); //初始化search } 

2)dao文件夹中新增全文检索, search 文件

db文件夹中新增, dbexpr.init.php 用于MySQL的一些特殊情况,例如下面的更新浏览数,将read_num作为语句的一部分,而不是一个变量出现在语句中

/*  * 更新浏览数  */ public function updateRead() {  $row = array(   'create_time' => time(),   'read_num' => new dbExpr('read_num+1')  );  $where = array(   'uid' => 10000008  );  return $this->update($row, $where); } 

3)library文件夹中

1.修改了分页类, pager.init.php ,从CI框架中扣过来的,并做了些改写, pager2.init.php 是原来的。

2.新增 weixin.init.phpweixinpay.init.php 类文件,分别是微信接口和微信支付。关于这两个类可以参照另外一个系列文章《 微信公众平台开发

五、library类库

library中存放了通用控制器、数据层逻辑、帮助函数、服务层逻辑、简单测试与第三方类库。

这个结构原先是放在app中的,现在我单独独立出来,就是为了能多个相关项目逻辑通用。

1)controller

这里先讲解 adminController 文件

1.多个验证,保证访问的安全

2.获取用户session的 user 方法,并可获取某个属性

3.获取传过来的参数方法 p ,get和post都可以,并能做过滤

4.模版设置方法 publicTemplate mainTemplate mainListTemplate mainFormTemplate layerTemplate

5.ajax返回参数方法 ajaxSuccessOutput (请求成功) 、ajaxFailureOutput (请求失败)

6.分页配置方法 alternate

7.获取页码方法 pageNo

2)dao

1. cache 是缓存

这里操纵的是memcache,这里推荐一款管理cache小工具,我已经放在了tool文件中。 查看InitPHP中cache文档

2. mongo 是操作MongoDB的文件集合

在abstract文件中封装了一些通用的操作,例如查询一条记录、多条记录、分页、更新、插入等。 memberDao 有一些demo示例。

注意文件夹夹的起名,例如bi/visitDao.php,类的名字就是visitBiMongoDao ,Dao在最后,然后是名字+文件夹目录,这是为了保证类名的唯一性,所以定了个规则。

wx放置的是与微信相关的数据类,基本都是些日志或请求返回的数据缓存等

3. mysql 是操作MySQL数据库的

里面也有个abstract,类中也封装了通用的操作,与mongo中的差不多。类的名字的规则也一样。 点击查看InitPHP中Dao操作 memberDao 同样有demo示例。

4. search 是全文检索

目前里面就写了点demo,没有做更多的封装

3)helper

1. dict 中存放的是数据字典,静态常量、静态数组字典等。例如密码混淆码常量、后台菜单字典等

2. view 中存放php编写的html代码,对应 app/xx/controller 中的各个 action

3. adminHelper (后台控件封装) formHelper (表单控件封装) urlHelper (url地址操作)。参照CI中的helper文件,这几个就是函数集合,里面并没有类

4)service

一些通用的逻辑其实可以写在这里的。 InitPHP中service 的功能不仅仅如此。还可以用作 RPC调用

rpc的配置文件写在了public中,如下图所示,可以单独配置个二级域名做引用,也可以共用。

配置如下:

$InitPHP_conf['customer'] = array(     "admin" => array( //可以进行分组         "host" => array("admin.grape.net"), //服务提供者所在的服务器的IP地址,一般是内网IP地址。可以填写多台服务器         "file" => "rpc.php" //访问服务的入口文件,例如加上IP地址:http://localhost/rpc.php     ) );

引用如下:

public function rpc() {         $ret = InitPHP::getRemoteService("user", "getUser", array(), 'admin');         print_r($ret); }

5)test

InitPHP中定义的test ,是用来测试应用的Service接口代码的。如果改造改造的话,还能做很多地方的测试。

示例代码的引用,写在了index/unittest中。

6)third

第三方库文件,目前放了个性能工具 xhprof ,将来还可以放支付宝库文件,OSS库文件,短信库文件,Excel操作库等等

GitHub地址:

https://github.com/pwstrick/grape

正文到此结束
Loading...