0

0

0

修罗

站点介绍

只有了解事实才能获得真正的自由

tp6.0开发初始化

修罗 2020-12-12 2148 0条评论 thinkphp5.1

首页 / 正文

tp6.0开发初始化

安装tp6:https://www.kancloud.cn/manual/thinkphp6_0/1037481

一、配置

1、开启调试

1607705256796.png

2、强制路由

1607705410427.png

3、数据库

1607705346207.png

二、定义公共返回数据方法

1607706004618.png

// 抛出异常
function ApiException($msg = '请求错误', $errorCode = 20000, $statusCode = 404){
  // 框架提供抛出异常的助手函数
  abort($errorCode, $msg, ['statusCode' => $statusCode]);
}

// 成功返回
function showResCode($data = '',$msg = 'ok',$code = 200){
  return json(['msg' => $msg, 'data' => $data],$code);
}

// 返回不带数据
function showResWithoutCode($msg = '', $code = 200){
    return showResCode([], $msg, $code);
}

控制器里使用公共方法

1607706065250.png

三、自定义异常

1607706442216.png

if (env('APP_DEBUG')) {
    // 其他错误交给系统处理
    return parent::render($request, $e);
}
$headers = $e->getHeaders();
return json([
    'msg' => $e->getMessage(),
    'errorCode' => $e->getStatusCode()
    ],array_key_exists('statusCode',$headers) 
    // 响应码404
    ? $headers['statusCode'] : 404);

控制器抛出异常

1607706395027.png

结果

1607706878806.png

四、自动实例化模型

我们将模型实例保存在$M变量中,继承Base的控制器通过$this->M拿到模型实例。

若不想自动实例化模型,继承Base的控制器配置$autoNewModel = false即可。

  • 控制器和模型需要子目录相同:比如控制器controller\v1模型model\v1
  • 模型名和控制器名一样

1607710120986.png

<?php
namespace app;
use app\BaseController;

class Base extends BaseController{
  // 是否自动实例化当前模型
  protected $autoNewModel = true;

  // 自定义实例化模型路径
  protected $ModelPath = null;

  // 保存当前模型实例
  protected $M = null;

  public function __construct(Request $request){
    // 初始化控制器相关信息
    $this->initControllerInfo($request);
    // 实例化当前模型
    $this->getCurrentModel();     
      // 当前控制器信息
      protected $Cinfo = [];
  }

  // 初始化控制器相关信息
  public function initControllerInfo($request){
    // $str = 'v1.Index'
    $str = $request->controller();
    // 获取真实控制器名称
    $this->Cinfo = [
      // 助手函数:获取类名(不包含命名空间)
      'Cname' => class_basename($this),
      'Cpath' => str_replace('.','\\',$str),
      // 当前方法
      'action' => $request->action()
    ];
    /**
     * "Cname" => "User"
     * "Cpath" => "v1\User"
     * "action" => "index"
     */
  }

  // 获取当前模型实例
  public function getCurrentModel(){
    if (!$this->M && $this->autoNewModel) {
      $model = $this->ModelPath ?? $this->Cinfo['Cpath'];
      $this->M = app('app\model\\'.$model);
    }
  }
}

继承base

1607710601517.png

结果

1607710619305.png

五、验证器自动化验证

验证器:https://www.kancloud.cn/manual/thinkphp6_0/1037624

php think make:validate v1/Index
  • $autoValidateCheck = true;是否开启自动验证
  • $excludeValidateCheck = [];不需要验证的方法
  • protected $autoValidateScenes = []; 验证场景配置; [方法名=>场景名] ,若没有配置,默认scene为方法名。

注意:

  • 验证器、控制器和模型需要子目录相同:比如控制器controller\v1模型model\v1验证器validate\v1
  • 验证器、模型名和控制器名一样
  • 因为我们通过$request->controller();(得到的结果例如:v1.Index)拿到控制器名,同时以此名字作为模型名和验证器名。

base添加

1607712779726.png

1、成员变量

// 是否开启自动验证
protected $autoValidateCheck = true;

// 不需要验证的方法
protected $excludeValidateCheck = [];

// 验证场景配置
protected $autoValidateScenes = [];

2、构造添加

// 自动验证
$this->autoValidateAction();

3、成员方法

// 自动化验证
public function autoValidateAction(){
  // app地址
  define('__APP_PATH__',__DIR__.'\\');
  // 当前方法
  $action = $this->Cinfo['action'];
  // 判断是否需要验证,不在排除方法中
  if ($this->autoValidateCheck && !in_array($action,$this->excludeValidateCheck)) {
    // 获取验证实例
    $validateName = file_exists(__APP_PATH__.'validate/'.$this->Cinfo['Cpath'].'.php') ? $this->Cinfo['Cpath'] : $this->Cinfo['Cname'];
    $validate = app('app\validate\\'.$validateName);
    // 获取验证场景
    $scene = $action;
    // autoValidateScenes = [Index => scene] 方法名 => 场景名
    if (array_key_exists($action,$this->autoValidateScenes)) {
      $scene = $this->autoValidateScenes[$action];
    }
    // 没有配置autoValidateScenes,默认scene为方法名
    // 开始验证
    $params = request()->param();
    if (!$validate->scene($scene)->check($params)) {
      // 抛出异常
      ApiException($validate->getError());
    }
  }
}

使用

1、验证器

1607713038291.png

2、控制器

1607713115492.png

3、路由

1607713399593.png

4、请求

1607713491022.png

评论(0)


最新评论

  • https://www.studyglobus.com/author/carroll34a5552/

    Ценники на вывоз мусора сейчас космос, любые лайфхаки по экономии в тему.

  • Richardgrold

    1xbet onlayn kazino platforması ilə vaxtınızı daha səmərəli və maraqlı keçirin. Saytın canlı kazino bölməsi istifadəçilərə fərqli bir dünya təklif edir. Burada canlı dilerli kazino oyunlarının hər bir növünü sınaqdan keçirə bilərsiniz. Krupyelərin peşəkarlığı oyunun dinamikasını və marağını artırır. Müntəzəm olaraq yenilənən oyun siyahısı cansıxıcılığa yol vermir. Hesabınızı artırmaq üçün onlarla fərqli və etibarlı üsul mövcuddur. Qazanılan pullar cəmi bir neçə dəqiqə ərzində şəxsi hesabınıza köçürülür. Aktiv fəaliyyətinizə görə fərdi bonuslar və hədiyyələr qazana bilərsiniz. Dəstək xidməti həm çat, həm də e-poçt vasitəsilə kömək göstərir. 1xbet ailəsinə qoşulun və böyük uduşlar üçün ilk addımı atın. onlayn kazino

  • 砂岩白丘

    我一直梦想, 看到你们相册那样的地方。真棒。

  • 城市地標

    我喜欢, 这里分享真实经验。你的项目 就是 属于这里的。请继续。

  • 宗教地標

    我热爱这样的想法, 去那么多国家。真的很鼓舞。

  • 觀景高地

    能感受到热爱。继续保持 感受。

  • 最佳季節

    我关注这样的资源, 写得很实在。你的网站 就是 属于这里的。加油。

  • 1

    1

  • 1

    1

  • -1' OR 2+158-158-1=0+0+0+1 or 'TKCTZnRa'='

    1

日历

2026年07月

   1234
567891011
12131415161718
19202122232425
262728293031 

文章目录

推荐关键字: Linux webpack js 算法 MongoDB laravel JAVA jquery javase redis