ThinkPHP5 如何升级到 ThinkPHP6?

前言

可能很多人都会苦恼,ThinkPHP5项目升级到ThinkPHP6项目怎么那么麻烦,不是只升级了一个版本吗?不用担心,您只需要跟着我下面的内容,一步一步来,就会避开很多坑!

模型

指定数据表名称

建议在模型中添加以下语句

// 自定义对应的数据库中数据表名称
protected $table = "news_category";

过滤非数据表字段

$model->allowField(true) // 过滤非数据表字段
改为
$model->save($data);

已经没那个方法了,会默认处理

修改器

如果在参数中不存在指定字段,也必须添加key

$data["uid"] = null;
$model->save($data);

部分函数必须指定返回值类型

public function getModelName() {
    return $this->name;
}

改为

public function getModelName() : string {
    return "ModelName";
}

判断select()返回值

$result = $model->select();
if ($result) {}

改为

$result = $model->select();
if (!$result->isEmpty()) {}

或改为

$result = $model->select()->toArray();
if (!empty($result)) {}

不再支持neq

->where("picture", "neq", "") // 有图片的

改为

->where("picture", "<>", "") // 有图片的

不再支持setInc()(改了也无效,建议改为update语句)

$model->where(["id" => $id])
      ->setInc("view");

改为

$model->where(["id" => $id])
      ->inc("view");

不再支持getLastInsID()

$result = $model->getLastInsID();
$result = $model->where("id", "=", "{$result}")->find();

改为

$result = $model
    ->order(["id" => "DESC"])
    ->find();

不再支持getError()

去掉

$model->getError();

实例化模型

$model = model("Category");

改为

$model = new CategoryModel;

控制器

删除原有的controller文件夹

将“D:\www\Project_PHP_ThinkPHP\01\think\app\controller”删除

_initialize()

自动调用_initialize()

改为

手动调用_initialize()

获取应用名(模块名)

request()->module()

改为

app('http')->getName()

不再支持ROOT_PATH

在“D:\www\Project_PHP_ThinkPHP\01\think\public\index.php”添加配置
在namespace think;后添加

if (!defined('DS')) {
    define('DS', DIRECTORY_SEPARATOR);
}
// ROOT_PATH
// .../public/
if (!defined('ROOT_PATH')) {
    define('ROOT_PATH', str_replace('\\', '/', realpath(dirname(__FILE__) . '/')) . "/");
}

模板

模板函数

$this->assign("categorys", $categorys);
$this->fetch();

改为
(静态方法)

View::assign("categorys", $categorys);
return View::fetch();

跳转

去掉

use think\Controller;

需要安装跳转扩展

模板常量和关闭模板缓存

在“D:\www\Project_PHP_ThinkPHP\00\think\config\view.php”添加配置

// 模板常量
'tpl_replace_string' => [
    '__STATIC__' => '/Project_PHP_ThinkPHP/01/think/public/static',
],
// 关闭模板缓存
'tpl_cache'     => false,

分页

在“D:\www\Project_PHP_ThinkPHP\00\think\config\view.php”添加配置

// 分页配置
'paginate'      => [
    'list_rows' => 5,
],

将“D:\www\Project_PHP_ThinkPHP\01\think\vendor\topthink\think-orm\src\paginator\driver\Bootstrap.php”复制一份
到“D:\www\Project_PHP_ThinkPHP\01\think\app\common\Bootstrap.php”
在“D:\www\Project_PHP_ThinkPHP\01\think\app\provider.php”添加配置

'think\Paginator'        => 'app\common\Bootstrap'

注意分页函数paginate的参数改变了

从控制器到模板会强制将字符串转实体

$data = "<span class=\"glyphicon glyphicon-star\"></span>"
{$data}

{$users->render()}

改为

$data = "<span class=\"glyphicon glyphicon-star\"></span>"
{$data|raw}

{$users->render()|raw}

验证器

验证规则注意事项

建议unique的值对应数据表名

"username" => "require|length:2,100|unique:news_user",

验证规则更新

["mobile", ["require", "regex:/^1(3\d|4[57]|5[0-37-9]|7[6-8]|8[0235-9])\d{8}$/", "unique:user"]]

改为

"mobile" => ["require", "regex:/^1(3\d|4[57]|5[0-37-9]|7[6-8]|8[0235-9])\d{8}$/", "unique:news_user"]

验证器

$model->validate(true) // 调用自定义validate类

改为

// 使用自定义validate类验证方式
try
{
    validate(UserValidate::class)->batch(true)->check($data);
}
catch (ValidateException $e)
{
    // 验证失败
    // var_dump($e->getError());
    $this->error($e->getMessage());
}

Session、Cookie

开启Session(使用验证码扩展必须开启Session)

在“D:\www\Project_PHP_ThinkPHP\00\think\app\middleware.php”设置

// Session初始化
\think\middleware\SessionInit::class

控制器中

use think\Session;
use think\Cookie;

改为

use think\facade\Session;
use think\facade\Cookie;

或改为
助手函数(时间参数单位为秒)

// 设置
session("name", "value");
// 判断是否存在
echo session("?name");
// 获取
echo session("name");
// 删除
session("name", null);
// 清除session
session(null);
// 设置
cookie("name", "value", 3600);
// 判断是否存在
echo cookie("?name");
// 获取
echo cookie("name");
// 删除
cookie("name", null);
// 清理全部
cookie(null);

销毁

去掉

session_destroy();

模板中

{$Think.session.xxx}

改为

{$Request.session.xxx}

设置获取配置文件

设置获取配置文件函数

config("name")

改为

use think\facade\Config;
Config::get("name");
Config::has("name");
Config::set("name", "value");

上传文件

获取文件

$files = request()->file("ff");
if ($files) {}

改为

$files = request()->file()["ff"];
if (!empty($files)) {}

验证

引入try catch,验证方法改变,验证图像文件的尺寸和类型有bug

// 保存上传的文件, 并获取文件名数组
$files = request()->file("ff");
if ($files) {
    $path = ROOT_PATH . "static/picture";
    $pictureArray = [];
    foreach ($files as $key => $value) {
        $info = $value->validate(["size" => 2048000, "ext" => "jpg,png,gif"])->move($path);
        if ($info) {
            $pictureArray[] = str_replace("\\", "/", $info->getSaveName());
        } else {
            $this->error($value->getError());
        }
    }
    // 数据库只能存放字符串数据类型,文件名数组要转化成字符串
    $data["picture"] = serialize($pictureArray);
    // 将字符串中的双引号替换成单引号
    $data["picture"] = str_replace("\"", "'", $data["picture"]);
}

改为

// 保存上传的文件, 并获取文件名数组
$files = request()->file();
try
{
    validate(["ff" => "fileSize:2048000|fileExt:jpg"])->check($files);
    $files = $files["ff"];
    if (!empty($files)) {
        $path = ROOT_PATH . "static/picture/";
        $pictureArray = [];
        foreach ($files as $key => $value) {
            $filename = \new_file::get_unique_file_name($value->getOriginalName());
            $result = move_uploaded_file($value->getPathName(), $path . $filename);
            if ($result) {
                $pictureArray[] = $filename;
            } else {
                $this->error("添加新闻分类失败!");
            }
        }
        // 数据库只能存放字符串数据类型,文件名数组要转化成字符串
        $data["picture"] = serialize($pictureArray);
        // 将字符串中的双引号替换成单引号
        $data["picture"] = str_replace("\"", "'", $data["picture"]);
    }
}
catch (ValidateException $e)
{
    // 验证失败
    // var_dump($e->getError());
    $this->error($e->getMessage());
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

skyksksksksks

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值