记录下thinkphp5自定义底层基类、内部类函数使用笔记 大部分笔记来自tp手册。

底层常用代码的封装

在控制器中基类的起着至关重要的作用,整个项目的代码安全,复杂程度,易读性都要看你项目的基类架构的.

比如api中都需要某一个功能函数,我们就可以写在基类里。

贴上一个基类返回错误码的例子:

<?php

namespace app\member\controller;
class Base extends \app\base\controller\Base
{

    static public function showReturnCode($code = '', $data = [], $msg = '')
    {
        $return_data = [
            'code' => '500',
            'msg' => '未定义消息',
            'data' => $code == 1001 ? $data : [],
        ];
        if (empty($code)) return $return_data;
        $return_data['code'] = $code;
        if(!empty($msg)){
            $return_data['msg'] = $msg;
        }else if (isset(ReturnCode::$return_code[$code]) ) {
            $return_data['msg'] = ReturnCode::$return_code[$code];
        }
        return $return_data;
    }

    static public function showReturnCodeWithOutData($code = '', $msg = '')
    {
        return self::showReturnCode($code,[],$msg);

    }

}

基类:

<?php
namespace app\base\controller;

class ReturnCode
{
    static public $return_code = [
        '1001' => '操作成功',
        '1002' => '你想做什么呢', //非法的请求方式 非ajax
        '1003' => '请求参数错误', //如参数不完整,类型不正确
        '1004' => '请先登陆再访问', //未登录 或者 未授权
        '1005' => '请求授权不符', ////非法的请求  无授权查看
        '1006' => '数据加载失败', //
        '1010' => '数据不存在', //
        '1020' => '验证码输入不正确', //
        '1021' => '用户账号或密码错误', //
        '1022' => '用户账号被禁用', //
        '1030' => '数据操作失败', //
    ];
}

然后就可以调用了

    private function getUid(){
        //数据库字段 网页字段转换
        $param = [
            'userid' => 'userid',
            'userpwd' => 'userpwd',
            'mobile' => 'mobile',
        ];
        $param_data = $this->buildParam($param);
        if (empty($param_data['userid'])&&empty($param_data['mobile'])) return self::showReturnCodeWithOutData(1003);
        $check_login = $this->doModelAction($param_data, 'base/Member.login', 'base/Member', 'checkLogin');
        if (!isset($check_login['code'])) $this->showReturnCodeWithSaveLog(1111);
        if ($check_login['code'] == 1001) {

        }
        return $check_login;

    }

框架构造函数使用

构造函数 在类的初始化时候执行的一个方法,构造函数中不要使用return关键词。

那么我们经常在构造函数里面做做什么呢?

  • 数据初始化 注入对象等
  • 前置工作的处理
  • 权限判断

我们看一下TP5 控制器的构造函数,他在初始化时候注入了request对象,我们继承了控制器,直接就可以使用$this->request调用,同时也封装了View类.同时对前置的beforeActionList属性的方法 进行处理.

public function __construct(Request $request = null)
    {
        if (is_null($request)) {
            $request = Request::instance();
        }
        $this->view    = View::instance(Config::get('template'), Config::get('view_replace_str'));
        $this->request = $request;

        // 控制器初始化
        $this->_initialize();

        // 前置操作方法
        if ($this->beforeActionList) {
            foreach ($this->beforeActionList as $method => $options) {
                is_numeric($method) ?
                $this->beforeAction($options) :
                $this->beforeAction($method, $options);
            }
        }
    }

对于权限判断的例子:

public function _initialize()
    {
        parent::_initialize(); // TODO: Change the autogenerated stub
        $user_agent = $this->request->server('HTTP_USER_AGENT');
        if (! strpos($user_agent, 'MicroMessenger') === false ) $this->isWechatBrowser = true;
        //判断提交方式和是否微信浏览器
        if ($this->request->method() == 'GET' && $this->isWechatBrowser === true){
            //未登录 重新登录
            if (!$this->checkAuth()&& !$this->no_login )  $this->wxoauth();
            $this->isLogin=true;
            //设置全局登录
            $this->loginGlobal();
            if(!$this->isReg){
                if(!$this->checkUuidMobile()) $this->redirect('user/user_blind.html');
            }
        }

    }

控制起来继承:

<?php

namespace app\api\controller;

class WxpayAction extends Auth
{
    public function _initialize()
    {
        config('default_return_type','html');
        parent::_initialize(); // TODO: Change the autogenerated stub
    }

    public function index($order_no='2017020453102495'){

        if(!$this->isWechatBrowser){
         //*******
         为了演示方便 这里省略了订单的是否支付验证

         另外 微信支付本身就有支付重复验证 这里并没有加入乐观锁过滤
         //*******
        $data=controller('base/WxPay')->payByOrderNo($order_no);
        $assign_data=[
            'title'=>'为了家健康--订单支付',
            'amount'=>$data['amount'],
            'order_no'=>$order_no,
            "jsApiParameters" =>$data['jsApiParameters'],
            'openid'=>$this->open_id,
            'data_md5'=>md5($order_no.$this->open_id.$data['amount']), //md5验证( 订单号 openid 金额)

        ];

        $this->assign($assign_data);
        return $this->fetch('wxpay/index');

    }

    public function showOrdersPayOk($order_no,$order_amount,$data_md5){
        //md5验证( 订单号 openid 金额)
        if (md5($order_no.$this->open_id.$order_amount)<>$data_md5){
            $assign_data=[
                'title'=>'为了家健康--支付出错了',
                'content'=>'你要支付的订单号不存在请核对后再支付!',
            ];
            $this->assign($assign_data);
            return $this->fetch('wxpay/err');
        }else{

            $assign_data=[
                'title'=>'为了家健康--该订单已经支付成功',
                'amount'=>$order_amount,
                'order_no'=>$order_no,
            ];
            $this->assign($assign_data);
            return $this->fetch('wxpay/ok');
        }
    }

    public function jsSign($url=''){
        $url= $url ? : $this->request->server('HTTP_REFERER');
        return json(controller('base/WxApi')->getJsSign($url));
    }

框架析构函数使用

析构函数就是一个收尾的一个方法,

例子:创建一个虚拟基类

<?php
namespace app\base\controller;

use think\Cache;
use think\Controller;
use think\Session;
use think\Loader;

abstract class Base extends Controller
{
    protected $error;             //出错时候的记录
    protected $log=[];            //要保存的记录
    protected $saveLog = false ;

    static public function showReturnCode($code = '', $data = [], $msg = '')
    {
        $return_data = [
            'code' => '500',
            'msg' => '未定义消息',
            'data' => $code == 1001 ? $data : [],
        ];
        if (empty($code)) return $return_data;
        $return_data['code'] = $code;
        if(!empty($msg)){
            $return_data['msg'] = $msg;
        }else if (isset(ReturnCode::$return_code[$code]) ) {
            $return_data['msg'] = ReturnCode::$return_code[$code];
        }
        return $return_data;
    }

        protected function addLog($code='',$msg=''){
        $this->log[] =[
            'uuid' => $this->uuid,
            'url' => $this->request->url(true),
            'method' => $this->request->method(),
            'data' => $this->getData(),
            'ip' => $this->request->ip(),
            'code'=>$code,
            'desc' => $msg,
        ];
    }
    protected function toSaveLog(){
        $this->saveLog = true ;
        $this->addLog();
    }

    protected function showReturnCodeWithSaveLog($code = '', $data = [], $msg = ''){
        $this->saveLog = true ;
        $this->addLog($code,$msg);
        return self::showReturnCode($code, $data, $msg);
    }

    protected function getData(){
        if ($this->request->isPost()){
            return $this->request->post();
        }else{
            return $this->request->get();
        }
    }
    protected function saveLogAction(){
        if (!empty($this->log)){
            foreach($this->log as $value){
                dump($value);
            }
        }
    }

    public function __destruct()
    {
        // TODO: Implement __destruct() method.
        //记录日志
        if (!empty($this->log) && $this->saveLog == true){
            $this->saveLogAction();
        }
    }
}

控制器继承:

<?php

namespace app\member\controller;
use app\base\model\Member;
use think\Cache;
use think\Db;

class Test extends Base
{

    public function index(){

       return $this->showReturnCodeWithSaveLog(1001,'演示析构函数成功了');

    }

}

thinkphp5底层基类封装、内部类函数的更多相关文章

  1. C++:抽象基类和纯虚函数的理解

    转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ...

  2. C++基础知识 基类指针、虚函数、多态性、纯虚函数、虚析构

    一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型 ...

  3. 四、spring集成ibatis进行项目中dao层基类封装

    Apache iBatis(现已迁至Google Code下发展,更名为MyBatis)是当前IT项目中使用很广泛的一个半自动ORM框架,区别于Hibernate之类的全自动框架,iBatis对数据库 ...

  4. salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※

    我们知道,salesforce中系统标准列表页面提供了相应的分页功能,如果要使用其分页功能,可以访问http://www.cnblogs.com/zero-zyq/p/5343287.html查看相关 ...

  5. Android 开发技巧 - Android 6.0 以上权限大坑和权限检查基类封装

    简单介绍 关于运行时权限的说法,早在Google发布android 6.0的时候,大家也听得蛮多的.从用户的角度来讲,用户是受益方,更好的保护用户的意思,而对于开发者来说,无疑增加了工作量. 对于6. ...

  6. python基础(14)-反射&类的内置函数

    反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...

  7. C++ 由虚基类 虚继承 虚函数 到 虚函数表

    //虚基类:一个类可以在一个类族中既被用作虚基类,也被用作非虚基类. class Base1{ public: Base1(){cout<<"Construct Base1!&q ...

  8. (转)(C++)关于抽象基类和纯虚函数

    ★抽象类:一个类可以抽象出不同的对象来表达一个抽象的概念和通用的接口,这个类不能实例化(创造)对象. ★纯虚函数(pure virtual):在本类里不能有实现(描述功能),实现需要在子类中实现.例: ...

  9. python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04

    多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...

随机推荐

  1. 记一次Mysql数据库Kill完之后启动不起来的解决方案

    在Mysql运行的时候,有时候会stop不了,这时候我们就会想直接把他的进程kill掉. 但是,有时候kill完了之后,在去start它就会直接抛异常了... ERROR! The server qu ...

  2. Dubbo 与 Spring Cloud 完美结合

    Dubbo 与 Spring Cloud 完美结合 1. 概述 可能说起来Dubbo,很多人都不陌生,这毕竟是一款从2012年就开始开源的Java RPC框架,中间由于各种各样的原因停止更新4年半的时 ...

  3. java基本数据类型与引用类型

    基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~3 ...

  4. ActiveMQ的安装与使用。

    1.什么是ActiveMQ ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE .4规范的 JMS Provider实现,尽 ...

  5. Day4 总结

  6. .NET Conf 2019 大会上发布.NET Core 3.0

    北京时间今天凌晨如期在.NET Conf 上发布.NET Core 3.0,Keynotes 由Scott Hunter 主演,主要围绕.NET Core 3.0的新特性和社区展开. 多功能性是.Ne ...

  7. php 上传word文件 Word文件转 PDF

    说一下,之前的时候做上传word文档转pdf的项目时候, 通过安装open office 连接服务组件, 遇到种种问题, 例如上传的word文档版本,, word文档中编辑的样式复杂会出现转pdf失败 ...

  8. Python奇技淫巧 - 持续更新中....

    Python奇技淫巧 人生苦短,我用Python: 编程界这绝对不是一句空话,尤其是对于使用过多个语言进行工作的同学们来说,用Python的时间越长,越有一种我早干嘛去了的想法,没事,啥时候用Pyth ...

  9. 阿里云安装zk并连接javaAPI测试

    1.安装 可参照Ubuntu 搭建Zookeeper服务进行安装并启动. 2.注意 阿里云环境开放2181端口 2.1 查看已开放端口: firewall-cmd --permanent --zone ...

  10. KD-tree学习笔记(超全!)

    目录 K-D树 更新信息 建树 插入 查询 k远/近询问 重构 K-D 树优化建边 后记 因为之前找不到全的博客,唯一的一篇码风比较毒瘤... 所以我就来写了 K-D树 大概是高维二叉树吧 每次按一个 ...