ikechukwukalu/dynamicdatabaseconfig

这是一个laravel包,帮助您动态设置数据库配置。

v2.0.1 2024-09-03 23:59 UTC

README

Latest Version on Packagist Quality Score Code Quality Known Vulnerabilities Github Workflow Status Total Downloads Licence

这个laravel包可以帮助您通过.env文件或database动态设置更多数据库配置。

需求

  • PHP 8.0+
  • Laravel 9+

安装步骤

composer require ikechukwukalu/dynamicdatabaseconfig

简介

这个包的需求是在我处理一个已经存在的项目时出现的,由于某些限制,这个项目为每个使用该应用程序的国家实施了9个数据库。这个应用程序还有一个所有国家都使用的中心数据库。

config/database文件看起来并不美观。我更愿意所有配置都在.env文件中。最大的问题是,如果数据库需求增长到19个怎么办?这些都是需要解决的待办事项和现有问题。

中间件

  • env.database.config
  • dynamic.database.config

Env.database.config 中间件

这个中间件使用后缀如ONE.env文件中获取数据库配置。这可以动态地为您的laravel应用程序声明额外的数据库连接。

  • 示例env配置
DB_HOST_ONE=127.0.0.1
DB_PORT_ONE=3306
DB_DATABASE_ONE=second_db
DB_USERNAME_ONE=root
DB_PASSWORD_ONE=
  • 示例中间件实现
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/**
 * mysql is the type of relational database connection being replicated - $database
 * mysql_1 is the new connection name - $name
 * ONE is the postfix - $postfix
 */

Route::middleware(['env.database.config:mysql,mysql_1,ONE'])->group(function () {
    Route::post('/user', function (Request $request) {
        /**
         * $request->_db_connection === 'mysql_1'
         */
        return \App\Models\User::on('mysql_1')->find(1);
    });
});

Route::post('/user', function (Request $request) {
        /**
         * $request->_db_connection === 'mysql_1'
         */
        return \App\Models\User::on('mysql_1')->find(1);
})->middleware('env.database.config:mysql,mysql_1,ONE');

如果您只需要设置以下会话值session(config('dynamicdatabaseconfig.session_postfix')),则不需要为中间件的$postFix变量添加后缀参数ONE,但如果设置了后缀参数,则将使用该参数而不是会话值。

Dynamic.database.config 中间件

这个中间件从主迁移数据库中的database_configurations表获取数据库配置。它使用一个独特的$ref变量。建议将独特的$ref变量设置为人类可读的,这样更容易运行包的console命令来运行迁移。这将为您的laravel应用程序动态声明额外的数据库连接。

  • 模型文件
use Ikechukwukalu\Dynamicdatabaseconfig\Models\DatabaseConfiguration;

protected $hidden = [
        'ref',
        'name',
        'database',

        /**
         * Accepts only arrays
         */
        'configuration'
];
  • 示例eloquent数据库插入
$countries = ['nigeria', 'ghana', 'togo', 'kenya'];
$config = \Config::get('database.connections.mysql');

foreach ($countries as $country) {
    $config['database'] = $country . '_db';
    DatabaseConfiguration::firstOrCreate(
    ['ref' => $country],
    [
        'ref' => $country,
        'name' => 'mysql_' . $country,
        'database' => 'mysql',
        'configuration' => $config
    ]);
}
  • 示例中间件实现
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/**
 * nigeria is $ref value
 */

Route::middleware(['dynamic.database.config:nigeria'])->group(function () {
    Route::post('/user', function (Request $request) {
        /**
         * $request->_db_connection === 'mysql_nigeria'
         */
        return \App\Models\User::on('mysql_nigeria')->find(1);
    });
});

Route::post('/user', function (Request $request) {
        /**
         * $request->_db_connection === 'mysql_nigeria'
         */
        return \App\Models\User::on('mysql_nigeria')->find(1);
})->middleware('dynamic.database.config:nigeria');

如果您只需要设置以下会话值session(config('dynamicdatabaseconfig.session_ref')),则不需要为中间件的$ref变量添加参数nigeria,但如果设置了ref参数,则将使用该参数而不是会话值。

默认情况下,存储在configuration字段中的值将被加密,但您可以通过设置.env文件中的DB_CONFIGURATIONS_HASH=false来调整这一点。

迁移

首先迁移laravel的初始数据库是强制性的。

  • php artisan migrate

其他迁移

  • 默认迁移
  • 隔离迁移

默认迁移

这将只迁移laravel默认迁移路径database/migrations中的文件。

php artisan env:migrate mysql mysql_1 ONE

php artisan dynamic:migrate nigeria

隔离迁移

这将只迁移指定迁移路径database/migrations/folder中的文件。

php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder

php artisan dynamic:migrate nigeria --path=database/migrations/folder

两者迁移

运行以下迁移将导致相应的数据库具有来自database/migrationsdatabase/migrations/folder中迁移的数据。

php artisan env:migrate mysql mysql_1 ONE
php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder

php artisan dynamic:migrate nigeria
php artisan dynamic:migrate nigeria --path=database/migrations/folder

具有播种的数据库迁移

php artisan env:migrate mysql mysql_1 ONE --seed
php artisan env:migrate mysql mysql_1 ONE --seeder=DatabaseSeederOne
php artisan env:migrate mysql mysql_1 ONE --seeder=DatabaseSeederOne  --path=database/migrations/folder

php artisan dynamic:migrate nigeria --seed
php artisan dynamic:migrate nigeria --seeder=DatabaseSeederNigeria
php artisan dynamic:migrate nigeria --seeder=DatabaseSeederNigeria  --path=database/migrations/folder

重新运行迁移

php artisan env:migrate mysql mysql_1 ONE --fresh
php artisan env:migrate mysql mysql_1 ONE --fresh --seed
php artisan env:migrate mysql mysql_1 ONE --fresh --seeder=DatabaseSeederOne
php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder --fresh
php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder --fresh --seeder=DatabaseSeederOne

php artisan dynamic:migrate nigeria --fresh
php artisan dynamic:migrate nigeria --fresh --seed
php artisan dynamic:migrate nigeria --fresh --seeder=DatabaseSeederNigeria
php artisan dynamic:migrate nigeria --path=database/migrations/folder --fresh
php artisan dynamic:migrate nigeria --path=database/migrations/folder --fresh --seeder=DatabaseSeederNigeria

刷新迁移

php artisan env:migrate mysql mysql_1 ONE --refresh
php artisan env:migrate mysql mysql_1 ONE --refresh --seed
php artisan env:migrate mysql mysql_1 ONE --refresh --seeder=DatabaseSeederOne
php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder --refresh
php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder --refresh --seeder=DatabaseSeederOne

php artisan dynamic:migrate nigeria --refresh
php artisan dynamic:migrate nigeria --refresh --seed
php artisan dynamic:migrate nigeria --refresh --seeder=DatabaseSeederNigeria
php artisan dynamic:migrate nigeria --path=database/migrations/folder --refresh
php artisan dynamic:migrate nigeria --path=database/migrations/folder --refresh --seeder=DatabaseSeederNigeria

回滚迁移

php artisan env:migrate mysql mysql_1 ONE --rollback
php artisan env:migrate mysql mysql_1 ONE --path=database/migrations/folder --rollback

php artisan dynamic:migrate nigeria --rollback
php artisan dynamic:migrate nigeria --path=database/migrations/folder --rollback

数据库播种

php artisan env:seed mysql mysql_1 ONE --seed
php artisan env:seed mysql mysql_1 ONE --seeder=DatabaseSeederOne

php artisan dynamic:seed nigeria --seed
php artisan dynamic:seed nigeria --seeder=DatabaseSeederNigeria

注意

  • 在迁移任何其他数据库之前,需要先迁移主数据库。
  • 如果不存在,将会创建数据库。
  • 每个数据库将保留自己的独立 migration 表。
  • 建议您不要发布包的迁移文件,除非您想将 database_configurations 表迁移到运行 默认迁移 时创建的每个额外数据库中。

发布迁移

  • php artisan vendor:publish --tag=ddc-migrations

发布配置

  • php artisan vendor:publish --tag=ddc-config

许可证

DDC包是一个开源软件,根据 MIT许可证 授权。