PHP8.4下webman直接使用topthink/think-orm

zxb

环境信息

  • 操作系统win11
  • php 8.4.1
  • webman-framework ^1.6.8
  • MySQL 8.4.3
  • topthink/think-orm ^3.0

说明

大佬留言PHP8.3以下版本 直接使用webman提供的webman/think-orm更方便、健全(见文末的留言)。
PHP 环境换为 8.4 使用webman/think-orm 报了个错;所以换topthink/think-orm,根据文档其支持PHP8.0+,但实际情况还是报相同的错(错误的暴力修改 在最后)。

webman直接使用 topthink/think-orm

  1. webman的相关文档业务初始化 业务初始化文档地址 先熟读此文档,再做后续设置。
  2. topthink/think-orm 的gitee仓库 及文档连接。
  3. 根据topthink/think-orm的文档说明,安装后,只需要设置数据库配置信息即可。
    use think\facade\Db;
    Db::setConfig([
    //配置数据,看官网
    ]);
  4. 所以:只要在webman 启动时做上述设置即可。
    4.1 建(找)个命名空间(目录),建个新的PHP文件放置如下代码:
<?php
//命名空间根据自己的实际情况来
namespace app\init;

use Webman\Bootstrap;
use Workerman\Worker;

use think\facade\Db;
// use support\Log;

//注意类名需要和文件名一致
class ThinkOrmInit  implements Bootstrap
{
    public static function start(?Worker $worker)
    {
        $databaseConfig = config('think_orm');//在config目录下建的一个think_orm.php配置文件,文件名随便,配置复制官网的
        // Log::info('databaseConfig:'.json_encode($databaseConfig));
        if ($databaseConfig) {
            Db::setConfig($databaseConfig);
            // Db::connect();//AI生成是有此,但官方文档不需要,所以没要
        }
    }

}

4.2 修改config目录下的 bootstrap.php 配置:

<?php
return [
    support\bootstrap\Session::class,
    support\bootstrap\LaravelDb::class,
    app\init\ThinkOrmInit::class,//是的就是增加这个
];

PHP的 php.ini 文件开启 extension=pdo_mysql
4.3 定义数据模型、数据的写入。注: 只测了模型数据写入,Db::name('user')->save($data);这样的数据写入没测试试。

注意

只在前面提到的环境下测试,其他环境下需要进一步验证。

暴力修改 topthink/think-orm 3.0 在PHP8.4的警告

下面描述的异常可能是我配置信息没设置对,导致$name是null触发的,熟悉 think-orm的朋友,指导一下谢谢。
异常内容如下:

ErrorException: think\DbManager::connect(): Implicitly marking parameter $name as nullable is deprecated, the explicit nullable type must be used instead in E:\x\项目\vendor\topthink\think-orm\src\DbManager.php:221

我的修改:找到文件、行,然后直接修改
221行

//原
public function connect(string $name = null, bool $force = false)

//改后 string $name 前加个 ? 号
public function connect(?string $name = null, bool $force = false)

234行也有同样的错:

//原
protected function instance(string $name = null, bool $force = false): ConnectionInterface
//改后
protected function instance(?string $name = null, bool $force = false): ConnectionInterface
161 2 0
2个评论

walkor

感谢分享。
为了避免误导,这里说明下

  1. webman/think-orm 并没有重写或者更改 topthink/think-orm 自身的代码
  2. webman/think-orm 只是在引入 topthink/think-orm 的情况下加了一个Bootstrap文件用于初始化
  3. PHP8.4报错是因为 topthink/think-orm 目前v3版本还没做PHP8.4的兼容,这并不是 webman/think-orm 的问题
  4. 因为 topthink/think-orm 不支持PHP8.4 而放弃使用 webman/think-orm 是一个错误的方案
  5. 不管是PHP7还是PHP8,在webman里使用 think-orm 最简单的方案就是安装 webman/think-orm

整个分享解决问题的路线就错了。webman/think-orm本身没有问题,但是你又自己实现了一遍webman/think-orm的逻辑,并且逻辑里没有考虑心跳、分页配置等逻辑。

最后PHP8.4刚发布不久,目前市面上很多composer组件并不支持PHP8.4,不建议现在就开始使用PHP8.4,会给自己找来很多麻烦,就比如这篇文章。

  • zxb 5天前

    好的 等待webman/think-orm的更新

  • zxb 5天前

    只要不高于 PHP8.4 ,其他的PHP8.x webman/think-orm 是可以正常使用的,是吧?

  • walkor 5天前

    白说了
    不是等 webman/think-orm 更新,是等 thinkphp官方的 topthink/think-orm 更新。
    8.0-8.3 都可以正常使用 topthink/think-orm

Tinywan

V3.0.28 就已经对8.4做兼容处理了

  • 暂无评论

zxb

320
积分
0
获赞数
0
粉丝数
2024-08-14 加入
×
🔝