tuzhi/tuzhi-simple-app

dev-master 2018-03-09 13:26 UTC

This package is not auto-updated.

Last update: 2024-05-31 18:13:03 UTC


README

$ composer create-project --prefer-dist --stability=dev  tuzhi/tuzhi-simple-app  {路径}
$ chmod -R 777 {路径}/app/runtime

注意

代码 严格按照 PSR-4 规范标准,请在编写时注意严格按照规范编写

配置文件

查看具体文件 config/config.php

如何创建控制器

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 继承 核心模型

关于核心模型的定义和应用

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模型的定义 一个文件 对应一个表

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(); 

关于集合模型的定义和应用

主要适用于 多表的关联条件查询

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 

关于视图

主要采用二步视图 具体的模板 参考 项目

// 二步视图渲染
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 模型中的 页码

<?php echo  new app\resource\widget\PagerWidget($Model->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);