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;
});
https://docx.rovecoder.com/framecoder/1.x/doc/4bctfaky/
查看我这篇文章
一定要需要修改composer包吗
walkor 大佬封装的 database 组件已经留下了教科书级别的扩展示范了
https://github.com/webman-php/database/blob/90abfaae7e9fde5f9a4265ae47396bc5c9ecc61c/src/Initializer.php#L56
方案一:效仿 MongoDB 的 extend 模式
只需要在 config/database.php 被加载后的任何地方(比如一个自定义的 bootstrap 文件)执行以下代码:
方案二:利用 Container 注入
牛的 这个我试试