composer 安装方式
$ composer create-project --prefer-dist --stability=dev tuzhi/tuzhi-simple-app {路径}
$ chmod -R 777 {路径}/app/runtime
注意
代码 严格按照 PSR-4 规范标准,请在编写时注意严格按照规范编写, (*1)
配置文件
查看具体文件 config/config.php, (*2)
如何创建控制器
namespace app\control;
class IndexControl extends \Control
{
/**
* 对应 url 路径 /
*/
public function defaultAction()
{
// 直接返回需要渲染的视图文件
return \View::fetch('index/default',['date'=>date("Y-M-d")]);
}
/**
* 对应 url 路径 /index/json
*/
public function jsonAction()
{
// 或者直接返回 数组 直接输出JSON 格式
return ['result'=>'success']
}
}
建立模型
本框架的模型包括 核心模型 support\model\Model 或者 \Model
AR模型 support\database\ActionRecord 或者 \ActiveRecord 继承 核心模型
集合模型 support\database\Collection 或者 \Collection 继承 核心模型, (*3)
关于核心模型的定义和应用
class MyModel extends \Model
{
protected $attFilter =
[
'username' ,
'password' ,
'verifyCode' ,
];
protected function labels()
{
return
[
'username' => '账户',
'password' => '密码',
'verifyCode' => '验证码'
];
}
/**
* @return array
*/
protected function rules()
{
return
[
['username','require'], //校验规则 必填
['password','require'],
['verifyCode','require'],
['verifyCode','callback',[$this,'validVerifyCode']], //校验规则 callback
['username','callback',[$this,'validUserStatus']],
['password','callback',[$this,'validAccount']]
];
}
/**
* @return bool
*/
public function validUserStatus()
{
$info = User::find()->where(['username'=>$this->username])->one();
if(isset($info['status']) && $info['status'] != User::STATUS_NORMAL){
return '您的账号已被禁用';
}
return true;
}
/**
* @return bool
*/
public function validVerifyCode()
{
if( strtolower($this->verifyCode) != strtolower(\Request::session('verifyCode')) ){
return '验证码错误';
}
return true;
}
/**
* @return bool|string
*/
public function validAccount()
{
if( ! \User::validAccount($this->username ,$this->password) ){
return '账户或者密码错误';
}
return true;
}
}
// 调用 一般在控制器中调用
$model = new MyModel();
// 这只 模型字段 根据模型设置 只会保留 $attFilter 中保留的三个字段 其他的都会被过滤掉
$model->setAttributes( \Request::all() );
// 模型字段校验 根据 rules() 中的规则验证
if( $model->verify())
{
//TODO:: 验证通过的操作
}else{
//TODO:: 校验失败后的操作
// 获取错误信息
$model->getErrors();
// 获取错误信息 第一条
$model->getFirstError();
}
关于AR模型的定义和应用
根据AR模型的定义 一个文件 对应一个表, (*4)
class User extends \ActiveRecord
{
/**
* 我们可以定义特性
* 关于为什么要定义特性呢
* 我的考虑是 查询主键不确定的集合的 增删查改 以及关联表的操作
* AR实例 则可以对包含主键的一行进行增删查改
*/
use UserTrait;
public static function tableName()
{
// 返回表名
return 'User';
}
}
//定义的特性
trait UserTrait
{
/**
* 获取代理下线子代理ID
*
* @param $userId
*/
public static function queryOfflineId( $userId )
{
return static::find()
->select(['uid','username'])
->where(['cuid'=>$userId])
->all();
}
}
// 引用特性中的查询
User::queryOfflineId( $userId );
// 常用的查询方式
// 1. 根据条件查询出一个值
User::find()->where(['username'=>$this->username])->one();
// 2. 复杂条件的查询
User::find(['useranme'])
->whereExpression( \DB::Expression(' age > 20 '))
->all();
// 3.更新
User::modify()->where('userId'=>1)->update("userName"=>"禅师");
// 4.插入
User::getNewRecord()->insert(
[
"userName"=>"禅师",
"age"=>18
]);
// 5.删除
User::delete()->where(['userName'=>"禅师"])->delete();
//直接使用AR中的方法
// 1.实例化AR 的方法
$UserModel = User::load( $value ); // $value 是主键
// 2.显示 某个值
$UserModel["userName"]; // 显示 禅师
// 3. 修改某个值
$UserModel["userName"] = "我是禅师";
$UserModel->save();
// 4. 删除该实例
$UserModel->remove();
关于集合模型的定义和应用
主要适用于 多表的关联条件查询, (*5)
class UserManageList extends \Collection
{
/**
* @var array 查询参数
*/
protected $attFilter =
[
'userId', // 用户ID
'userType', // 账户类型
'userName',
];
/**
* @return array
*/
protected function getColumns()
{
return
[
'a.uid' , //用户ID
'a.username' , // 账号
'a.ctype' , //用户分组
new Expression('e.username as agentName')
];
}
public function buildQuery()
{
$Query = $this->Query;
$Query->select( $this->getColumns() )
->table(User::tableName(),'a')
->leftJoin(Manager::tableName(),'b','a.mid=b.uid')
->leftJoin(User::tableName(),'f','a.cuid=f.uid');
$Query->leftjoin(User::tableName(),'e','a.cuid=e.uid');
// 获取最新的分成
$Query->leftjoin(UserDivided::tableName(),'d','a.uid=d.uid AND d.dt="'.date('Y-m-d',strtotime('-1 day')).'"');
$this->userId
? $Query->where(['a.uid'=>$this->userId])
: null;
$this->userName
? $Query->andLike('a.username','%'.$this->userName.'%')
: null;
// 是否有区间的问题
if( is_array($this->userType) ){
$Query->andIn('a.ctype',$this->userType);
}else{
$this->userType
? $Query->where(['a.ctype'=>$this->userType])
: null ;
}
// 设置排序
$Query->orderBy('a.uid',Query::DESC);
}
}
// 使用方式 以下代码在控制器中
// 设置查询条件
$Model = new UserManageList();
$Model['userId'] = Request::get('userId','int');
$Model['userType'] = Request::get('userType','int');
$Model['userName'] = Request::get('userName');
// 设置页码
$Model->setPage( Request::get('page','int',1) ,30);
// 查询
$Model->query();
// 关于遍历集合的方式
foreach( $Model as $index=>$value )
{
}
// 关于页码信息
/**
* 可以定义自己的页码处理类
* 设置保护属性 pagerClass
*/
$Model->Pager
关于视图
主要采用二步视图
具体的模板 参考 项目, (*6)
// 二步视图渲染
View::layout('index/index',
[
'model'=>$model
]
);
// 文件直接渲染
View::fetch('index/index',
[
'model'=>$model
]
);
// layout 对应的路径为 resource/layout
// 视图文件对应的路径 resource/view
// 支持简单的widget resource/widget
// 关于 widget 查看简单的例子
name app\resource\widget;
class PagerWidget
{
public $html;
public $pager;
public function __construct( $pager )
{
$this->pager = $pager;
$this->createHtml();
}
public function createHtml()
{
$html = '';
if( $this->pager ){
$html .= '<div class="page">';
$html .= '<span>( 每页 :'.$this->pager['pageSize'].', 总数 :'.$this->pager['count'].')</span>';
$html .= '<a href="'.$this->pager['prev']['url'].'">上一页</a>';
foreach($this->pager['list'] as $list){
if( $list['selected'] ){
$html .= '<a class="current">'.$list['text'].'</a>';
}else{
$html .= '<a href="'.$list['url'].'">'.$list['text'].'</a>';
}
}
$html .= '<a href="'.$this->pager['next']['url'].'">下一页</a>';
$html .= '</div>';
}
$this->html = $html;
}
public function __toString()
{
return $this->html;
}
}
// 对应Collecter 模型中的 页码
Pager);?>
缓存
缓存配置
return
[
'cache'=>
[
'default' => 'file' , // 默认使用的缓存 对应 support 下支持的方式
'support' =>
[
'file' =>
[
'keyPrefix' => 'cache_', // 前缀
'cacheDir' => '&runtime/cache', // 文件缓存路径
'fileSuffix' => '.cache' // 文件后缀
],
'memcached' =>
[
'keyPrefix' => 'cache_', // 前缀
'server' => '@server.memcached.server_1' // 服务器配置信息 @ 为配置引用
]
]
]
];
缓存的使用
//默认使用
Cache::set( $key,$value,$expiry=0 );
Cache::get( $key );
Cache::delete( $key );
Cache::increment( $key,$step=1,$expiry = 0);
Cache::decrement($key,$step=1,$expiry = 0);
// 指定模块使用
Cache::memcached->set( $key,$value,$expiry=0 );
Cache::memcached->get( $key );
Cache::memcached->delete( $key );
Cache::memcached->increment( $key,$step=1,$expiry = 0);
Cache::memcached->decrement($key,$step=1,$expiry = 0);