thinkphp5.0之目录结构设计经验总结

PHP 1156浏览 评论

作为thinkphp的忠实实践者,期待已久的5.0已经发布良久,最近也是诸多项目实践一番,不过精髓还有些没有触及到,在后面的项目中我们再进一步了解它,并且使用它,在thinkphp5.0中还是发现了比较多的亮点,也希望大家在使用的过程中能够互相交流,这里我主要介绍我们项目目录结构,我还是一直沿用thinkphp3.2的结构目录下面我来总结一番!!

blob.png

我在项目中增加了data目录与validate目录,data目录主要是基础模型里面封装了通用的增删改查操作方法,validate主要封装了通用的验证规则!

Q:好处在哪里?

A:按照thinkphp的原理来讲,我们每一张表对应一个model文件,每个model文件都会有增删改查的方法,这样就感觉会有很多冗余的代码和文件,我们只需要实例化的时候传入表名就能自动实例化模型就比较方便了,第一是为了精简代码,第二是为了让项目更加的简洁,让没有必要的文件多余!而有及其特殊的方法我们可以继承改类即可!

看下data目录下data.php文件

<?php
/**
 * Created by PhpStorm.
 * User: TangYijun
 * Date: 2017/3/13 0013
 * Time: 18:12
 */
namespace app\data;
use think\Model;
use think\Db;

/**
 *
 * Class Data
 * @package app\data
 */
class Data extends Model{
    protected $tableName;
    //构造方法,实例化表名
    public function __construct($tableName = ''){
        $this->tableName = $tableName;
    }

    /**
     * 查询一条数据
     * @param array $where
     * @param string $field
     * @return array|false|mixed|\PDOStatement|string|Model
     */
    public function find($where = [],$field = '*'){
        return Db::name($this->tableName)->field($field)->where($where)->find();
    }

    /**
     * 返回某个字段的值
     * @param string $where
     * @param mixed|null $field
     * @return mixed
     */
    public function value($where,$field){
        return Db::name($this->tableName)->where($where)->value($field);
    }

    /**
     * 更新某个字段的值
     * @param array|string $where
     * @param mixed|string $data
     * @return int
     */
    public function setField($where,$data){
        return Db::name($this->tableName)->where($where)->setField($data);
    }

    /**
     * 连表查询单条信息
     * @param $join
     * @param array $where
     * @param string $field
     * @return array|false|\PDOStatement|string|Model
     */
    public function joinOne($join,$where = [],$field = ''){
        return Db::name($this->tableName)->alias('a')->field($field)->join($join)->where($where)->find();
    }

    /**
     * 统计
     * @param string $where
     * @param $field
     * @return float|int
     */
    public function sum($where,$field){
        return Db::name($this->tableName)->where($where)->sum($field);
    }

    /**
     * 连表查询多条信息
     * @param $join
     * @param array $where
     * @param string $field
     * @param string $order
     * @param string $limit
     * @return false|\PDOStatement|string|\think\Collection
     */
    public function joinAll($join,$where=[],$field='',$order='',$limit=''){
        return Db::name($this->tableName)->alias('a')->field($field)->join($join)->where($where)->order($order)->limit($limit)->select();
    }

    /**
     * @param array $data  插入的数据
     * @return mixed 返回新增数据的自增主键
     * 插入数据的方法
     */
    public function insertData($data = []){
        return Db::name($this->tableName)->insertGetId($data);
    }

    /**
     * @param $data
     * @return int|string
     * 添加数据
     */
    public function _insert($data){
        return Db::name($this->tableName)->insert($data);
    }
    /**
     * @param array $data
     * @return int|string
     * 插入多条数据
     */
    public function insertAll($data = []){
        return Db::name($this->tableName)->insertAll($data);
    }

    /**
     * @param array $data  更新数据
     * @param array $where  更新条件可为空,如果为空则更新数据需包含主键
     * @return mixed
     * update 方法返回影响数据的条数,没修改任何数据返回 0
     */
    public function updateData($data = [],$where = []){
        if(empty($where)){
            return Db::name($this->tableName)->update($data);
        }
        return Db::name($this->tableName)->where($where)->update($data);
    }

    /**
     * @param array $where  自增条件
     * @param string $field  自增字段名称
     * @param int    $value     自增值
     * @return mixeds 方法返回影响数据的条数
     * 自增一个字段的值
     */
    public function _setInc($where = [],$field = '',$value = 1){
        return Db::name($this->tableName)->where($where)->setInc($field,$value);
    }

    /**
     * @param array $where   自减条件
     * @param string $field   自减字段名称
     * @param int    $value      自减值
     * @return mixed 方法返回影响数据的条数
     * 自减一个字段的值
     */
    public function _setDec($where = [],$field = '',$value = 1){
        return Db::name($this->tableName)->where($where)->setDec($field,$value);
    }

    /**
     * @param  int $id 主键的值
     * @return  mixed 方法返回影响数据的条数,没有删除返回 0
     * 根据主键删除一条数据
     */
    public function deleteDaPtaByPrimaryKey($id = 0){
        return Db::name($this->tableName)->delete($id);
    }

    /**
     * @param array $where  删除条件
     * @return mixed  delete 方法返回影响数据的条数,没有删除返回 0
     * 根据条件删除数据
     */
    public function deleteByWhere($where = []){
        return Db::name($this->tableName)->where($where)->delete();
    }

    /**
     * @param array $where   查询条件
     * @param int $page      每页显示的数据
     * @param string $order
     * @param array $query  搜索条件
     * @param array $join   链表
     * @param string $filed 查询字段
     * @param int $currentPage 当前页码
     * @return mixed         返回一个数据对象
     * 查询数据的方法 带分页
     */
    public function page($where = [],$order = '',$page = 20,$query = [],$join = [],$filed = '*',$currentPage=1){
        return Db::name($this->tableName)->alias('a')->field($filed)->join($join)->where($where)->order($order)->paginate($page,false,['query'=>$query,'var_page'=>'page','page'=>$currentPage]);
    }

    /**
     * @param array $where
     * @param string $order
     * @param int $page
     * @param array $query
     * @param string $filed
     * @param int $currentPage
     * @return \think\Paginator
     */
    public function pageSelf($where = [],$order = '',$page = 20,$query = [],$filed = '*',$currentPage=1){
        return Db::name($this->tableName)->alias('a')->field($filed)->where($where)->order($order)->paginate($page,false,['query'=>$query,'var_page'=>'page','page'=>$currentPage]);
    }

    /**
     * 记录后台操作日志
     * @param $action
     * @return int|string
     */
    public function addAdminLog($action)
    {
        $id = cookie('login');
        $username = Db::name('admin')->where("id = $id")->value('username');
        // 插入操作日志
        $add['uid'] = $id;
        $add['uname'] = $username;
        $add['uip'] = ip2long($_SERVER["REMOTE_ADDR"]);
        $add['log_action'] = $action;
        $add['log_time'] = time();
        return Db::name('admin_log')->insert($add);
    }
    /**
     * @param array $where  查询条件
     * @param string $field  查询字段
     * @param string $order  排序
     * @param string $limit  条数
     * @return false|\PDOStatement|string|\think\Collection  返回一个数组
     */
    public function selectData($where = [],$field = '*',$order = '',$limit = ''){
        return Db::name($this->tableName)->where($where)->field($field)->order($order)->limit($limit)->select();
    }

    /**
     * @param string $alias 当前表别名
     * @param array $join 默认 INNER JOIN: 举例 [[表名1,条件1,类型1],[表名2,条件2,类型2],]
     * $join = [['auth_group_access c','a.id=c.uid','left'],];
     * @param array $where
     * @param string $field
     * @param string $order
     * @param string $limit
     * @return mixed
     */
    public function joinData($alias='a',$join=[],$where = [],$field = '*',$order = '',$limit = ''){
        return Db::name($this->tableName)->alias($alias)->join($join)->where($where)->field($field)->order($order)->limit($limit)->select();
    }

    /**
     * @param string $distinct
     * @param string $alias
     * @param array $join
     * @param $where
     * @param $field
     * @param $order
     * @param $limit
     * @return false|\PDOStatement|string|\think\Collection
     * 去掉重复
     */
    public function distinct($distinct = 'a',$alias = 'a',$join = [],$where,$field,$order,$limit){
        return Db::name($this->tableName)->distinct(true)->alias($alias)->join($join)->where($where)->field($field)->order($order)->limit($limit)->select();
    }

    /**
     * @param string $where
     * @return int|string
     * 聚合函数
     */
    public function count($where){
        return Db::name($this->tableName)->where($where)->count();
    }
}

我这里封装了大多数常用的方法,基本上够整个项目来使用了,这让我们在开发其他模块会大大的提高效率并且给我们带来非常大的方便,如果你经常开发项目的话你一定会发现这一点。


接下来我们看一下如何调用,比如我要操作:server_category这张表,我只需要new就可以了,接下来调用查询数据的方法

$server_cate = new \app\data\Data('server_category');
$parent = $server_cate->selectData();

上面我介绍了data目录以及基础模型的使用方法,以及给我们带来的好处!当然了,这不是很完美的,也可写成static 会让代码更加的简洁,不过这里我就不再做说明了!

下面我们介绍validate目录:

Q:该目录的作用?

A:为什么我要建立这样一个目录呢,第一个为了让代码的层次更加明白和清楚,因为统统的把代码写在控制器的一个方法,业务逻辑不够清楚,代码层次不够明确,后期让人看起来会比较的头疼,并且你会发现你做后台需要验证,你在前台提交表单也需要验证,你在开发api的时候也需要验证,这样会导致你在每一个模块都会写一个validate来验证,这样无疑会增加很多个validate目录,加大项目的结构,加大维护力度!为了解决刚说到的问题,这是我建立这个目录的原因,当然了这不是最好的办法,你如果有更好的主意,我很希望你在下方给我一些建议!

接下来我说下我建立这个目录如何使用:在这个目录下你可以随意的建立验证文件,我们在需要使用的地方调用即可,下面我举个例子,我在validate目录下建立了一个AdminValidate.php文件,一下是验证规则

class AdminValidate{
    protected $rule = [
        'username'  =>  'require|max:25',
        'password'  =>  'require',
    ];

    protected $message  =   [
        'username.require' => '用户名必须填写',
        'username.max'     => '用户最多不能超过25个字符',

        'password.require' => '密码必须填写',
    ];
    public function adminValidate(){
        $validate['rule']    = $this->rule;
        $validate['message'] = $this->message;
        return $validate;
    }
}

接下来我在admin模块需要使用它

$admin_validate = new AdminValidate();
$validate_rule = $admin_validate->adminValidate();                                  /*获取验证规则*/
self::validateData($validate_rule['rule'], $validate_rule['message'],$post);       /*验证数据*/

当然了 这里我写了一个validateData的方法专门来验证方法代码为

public static function validateData($rule = [],$message = [],$post = []){
    $validate = new Validate($rule,$message);
    $validate_result   = $validate->check($post);
    if(!$validate_result){
        throw new \LogicException($validate->getError(),Config::get('error_table.validate')['code']);/*返回验证结果*/
    }
    return true;
}

这样我们在任何一个模块下都可以随意的调用验证规则了,应该算比较方便的了,就介绍到这里了,希望大家有更好的主意,提供给大家学习,感谢!

本文连接:http://www.phpbloger.com/article/25.html 文章都为原创,转载请注明出处!

相关文章