环境信息
- 操作系统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+,但实际情况还是报相同的错(错误的暴力修改 在最后)。
PHP8.4 较新 可能更多框架未及时更新 以下方法勿用于生产。
webman直接使用 topthink/think-orm
- webman的相关文档
业务初始化
业务初始化文档地址 先熟读此文档,再做后续设置。 - topthink/think-orm 的gitee仓库 及文档连接。
- 根据
topthink/think-orm
的文档说明,安装后,只需要设置数据库配置信息即可。
use think\facade\Db;
Db::setConfig([
//配置数据,看官网
]);
- 所以:只要在webman 启动时做上述设置即可。 (以下的配置Linux的设置也是一致)
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