Laravel动态添加或修改数据库配置

利用Laravel服务提供者, 动态修改或者添加数据的配置

DatabaseServiceProvider

扩展配置文件

创建Database服务提供者

php artisan make:provider DatabaseServiceProvider

加载(注册)服务提供者, 两种办法

方法一.AppServiceProvider中注册

<?php

namespace App\Providers;
...
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
    
    
        //
        $this->app->register(DatabaseServiceProvider::class);
    }

方法二.confg/app.php中全局添加

'providers' => [
    ...
    App\Providers\DatabaseServiceProvider::class,

DatabaseServiceProvider 服务提供者中扩展数据库配置

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class DatabaseServiceProvider extends ServiceProvider
{
    
    
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
    
    
        //
        $new = [
            'mydb-test' => [
                'driver' => 'mysql',
                'host' => 'docker.app',
                'port' => env('DB_PORT', '3306'),
                'database' => env('DB_DATABASE', 'forge'),
                'username' => env('DB_USERNAME', 'forge'),
                'password' => env('DB_PASSWORD', ''),
                'unix_socket' => env('DB_SOCKET', ''),
                'charset' => 'utf8mb4',
                'collation' => 'utf8mb4_unicode_ci',
                'prefix' => '',
                'strict' => true,
                'engine' => null,
            ]];
        $this->app['config']['database.connections'] = array_merge($this->app['config']['database.connections'], $new);

    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
    
    
    }
}

测试, tinker中连接数据库即可

上述代码已经可以实现需求,但是不够风骚。

下述代码my-test为连接下标, set方法会自动设置对应的数组下标

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class DatabaseServiceProvider extends ServiceProvider
{
    
    
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
    
    
	    $new = [
                'driver' => 'mysql',
                'host' => 'docker.app',
                'port' => env('DB_PORT', '3306'),
                'database' => env('DB_DATABASE', 'forge'),
                'username' => env('DB_USERNAME', 'forge'),
                'password' => env('DB_PASSWORD', ''),
                'unix_socket' => env('DB_SOCKET', ''),
                'charset' => 'utf8mb4',
                'collation' => 'utf8mb4_unicode_ci',
                'prefix' => '',
                'strict' => true,
                'engine' => null,
            ];

        $this->app->get('config')->set('database.connections.mydb-test', $new);
	}
	
	
	/**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
    
    
    }
}

剩下的, 你可以用tinker测试数据库连接是不是已经成功添加

猜你喜欢

转载自blog.csdn.net/q116975174/article/details/103958764
今日推荐