国产化数据库如何去做兼容

会飞的鱼

问题描述

想连接达梦,人大金仓数据库但是用webman的 database连接错误,请问所有的orm驱动都在composer包里面吗?

248 2 2
2个回答

hot12121212
北月妖王

walkor 大佬封装的 database 组件已经留下了教科书级别的扩展示范了

https://github.com/webman-php/database/blob/90abfaae7e9fde5f9a4265ae47396bc5c9ecc61c/src/Initializer.php#L56

方案一:效仿 MongoDB 的 extend 模式

只需要在 config/database.php 被加载后的任何地方(比如一个自定义的 bootstrap 文件)执行以下代码:

use Illuminate\Database\Connection;
use LaravelDm8\Dm8\Connectors\DmConnector;
use LaravelDm8\Dm8\Dm8Connection;
use support\Db;

// 1. 先告诉 Connection 工厂,遇到 'dm' 驱动时,底层用哪个 Connection 类
Connection::resolverFor('dm', function ($connection, $database, $prefix, $config) {
    return new Dm8Connection($connection, $database, $prefix, $config);
});

// 2. 利用 Webman 暴露出的 DatabaseManager 实例进行扩展
// 这步解决了 ConnectionFactory 找不到 'dm' connector 的问题
Db::connection()->getDatabaseManager()->extend('dm', function ($config, $name) {
    $connector = new DmConnector();
    $pdo = $connector->connect($config);
    return new Dm8Connection($pdo, $config['database'], $config['prefix'], $config);
});

方案二:利用 Container 注入

use Illuminate\Container\Container as IlluminateContainer;
use LaravelDm8\Dm8\Connectors\DmConnector;
use Illuminate\Database\Connection;
use LaravelDm8\Dm8\Dm8Connection;

// 1. 静态注册解析器
Connection::resolverFor('dm', function ($connection, $database, $prefix, $config) {
    return new Dm8Connection($connection, $database, $prefix, $config);
});

// 2. 往容器里绑定驱动,这样 ConnectionFactory::createConnector 就会直接命中 bound()
IlluminateContainer::getInstance()->bind('db.connector.dm', function () {
    return new DmConnector;
});
🔝