参考yii开发的简易框架,基于MVC设计,结构清晰,有兴趣的人可以加入我们。
- config 配置项
- db.php 数据库配置
- main.php 主配置项
- params.php 全局参数设置项
- urlmanage Restful 配置
- framework 框架底层
- lib 外部类库
- modules 应用层(mvc)
- controllers 控制层
- models 模型层
- views 视图层
- layouts 布局
- web
- index.php 入口
与Yii类似,以 base::$app 来获取相应属性及操作对象,如:
base::$app->method 获取请求方式
base::$app->get 获取get方式参数
base::$app->put 获取put方式参数
base::$app->db 获取数据库操作对象 【这里没做太多处理,就是pdo对象,后期优化】
base::$app->params 获取全局定义参数
framework目录:
CWebApplication 应用主体
Connection.php 操作db基类,封装方法 insert、update、select、delete,复杂方法待补充
BaseModel.php 基础Model 基类
CRequest.php 请求解析
写在前面,restful 对url重写要求有点高,需要服务器做些处理,框架使用的是apache服务器,需要在web下添加 .htacess 文件,内容如下:
RewriteEngine on #rewriteengine为重写引擎开关on为开启off为关闭
#如果不是真实存在的目录或文件,则分发请求给index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)$ index.php
其实就是将复杂的url,如localhost/user/10 分发给index.php处理;Nginx处理,需要在nginx.conf 中添加
location / {
...
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
}
main.php 添加
'rules' => [
#控制器 =》 配置
controllerId => [
'extraPatterns' => [
urlId => actionId, //参数获取id匹配原actionId
...
],
],
controllerId 代表控制器id,actionId 代表动作Id,urlId 代表url中表示actionId的参数,如:
...
'user' => [
'extraPatterns' => [
'index123' => 'index', //参数获取id匹配原actionId
...
],
],
...
localhost/user/index123 所指真实地址就是/user/index;
restful 以资源来定位,通过http动词来执行相应动作,主要:
GET /users: 逐页列出所有用户;
HEAD /users: 显示用户列表的概要信息;
POST /users: 创建一个新用户;
GET /users/123: 返回用户为 123 的详细信息;
PATCH /users/123 and PUT /users/123: 更新用户 123;
DELETE /users/123: 删除用户 123;
restful API 默认提供 create、delete、update、select、detail接口,需要一些处理下面会做详细说明,实际使用会更复杂,可自行添加相应action,必须在配置项 extraPattern 添加对应规则,上面已经举例。
create、delete、update、select、detail这些默认接口,是对单一的数据表结构进行操作,逻辑复杂可自己重写,启用操作如下:
- 新增数据表操作model,继承baseModel,提供数据表
namespace openyii\modules\models;
use openyii\framework\BaseModel;
class UserModel extends BaseModel
{
public $cols = array(); //子类定义显示字段,如'id','username'
/*提供表名*/
public static function tableName(){
return 'user';
}
2.新增控制器提供,表操作model
namespace openyii\modules\controllers;
use openyii\framework\CController;
class UserController extends CController
{
public $modelClass = 'openyii\modules\models\UserModel'; //定义user操作model
}
如此,一个简易的restful接口完成,是对user用户资源的操作,需要添加复杂的接口操作,可以重写接口逻辑,或者加个接口,如:
...
public function actionIndex(){
...
echo 'Hello World!';
}
...
main.php配置中增加:
- 单台redis服务
...
'redis' => [
'class' => 'openyii\framework\CRedis',
'hostname' => '192.168.33.30',
'port' => 6379,
],
...
- 哨兵主从模式(redis服务ip可直接访问):
...
'redis' => [
'class' => 'openyii\framework\CRedisHa',
'sentinels' => [
'192.168.33.30:5000', //哨兵服务ip:端口
'192.168.33.30:5001',
'192.168.33.30:5002',
],
'masterName'=>'redis-master', //主机名称
],
...
- 哨兵主从模式(redis服务ip不可直接访问,ip映射访问):
...
'redis' => [
'class' => 'openyii\framework\CRedisServer',
'servers' => [
'192.168.33.30:6379', //redis服务ip:端口
'192.168.33.30:6380',
'192.168.33.30:6381',
]
]
...
通过选择不同的class来更换存储方式,目前支持如下:
- openyii\framework\CSessionRedis redis存储
- openyii\framework\CSessionDB mysql(暂时没提供其他数据库)存储
main.php配置中增加:
...
'session'=>[ //session存贮
'class'=>'openyii\framework\CSessionRedis',
'timeout'=>3600, //过期时间
'keyPrefix'=>'sun', //session设置 key前缀
],
...
...
'session'=>[ //session存贮
'class'=>'openyii\framework\CSessionDB',
'timeout'=>3600,
'keyPrefix'=>'sun',
'tableName'=>'openYiiSession', //DB表
],
...
需要提前建好存放session的表,存贮引擎建议memory,需要包含三个字段:jq_SessionId、jq_SessionValue、jq_ExpireTime。参考建表:
CREATE TABLE `openYiiSession` (
`jq_SessionId` varchar(255) NOT NULL,
`jq_SessionValue` varchar(800) NOT NULL,
`jq_ExpireTime` int(11) NOT NULL,
PRIMARY KEY (`jq_SessionId`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
有任何意见或建议都欢迎提 issue