config/database.php中的Laravel-Do逻辑

config/database.php中的Laravel-Do逻辑,database,laravel,config,Database,Laravel,Config,大家都知道,在Laravelconfig/database.php中,是一堆数组和值。但在某些情况下,我需要在那里做一些逻辑,我在config/database.php中做了一些简单的逻辑,它正按照我想要的方式工作(可以参考下面的代码),但我想知道这样做是否合适/实用 如果不可行,您能建议获得以下相同结果的其他方法吗 'connections' => [ 'mysql' => (function(){ $config = [ 'dr

大家都知道,在Laravel
config/database.php
中,是一堆
数组
。但在某些情况下,我需要在那里做一些逻辑,我在
config/database.php
中做了一些简单的逻辑,它正按照我想要的方式工作(可以参考下面的代码),但我想知道这样做是否合适/实用

如果不可行,您能建议获得以下相同结果的其他方法吗

'connections' => [

    'mysql' => (function(){ 
        $config = [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'live_db'),
            'username' => env('DB_USERNAME', 'myuser'),
            'password' => env('DB_PASSWORD', '2309423234'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => 'gn_',
            //'prefix_indexes' => true,
            'strict' => false,
            'engine' => env('DB_ENGINE', null),
        ]; 

        // do some logic here (and it's working!!)
        // but........
        // is it okay to do like this?
        if(env('DB_WITH_SSLMODE', false)){
            $config += [
                'sslmode' => env('DB_SSLMODE', 'prefer'),
                'options'   => [
                    PDO::MYSQL_ATTR_SSL_CA    => env('DB_OPT_MYSQL_ATTR_SSL_CA', 'C:\wamp64\bin\cloudsql\certificates\server-ca.pem'),
                    PDO::MYSQL_ATTR_SSL_CERT    => env('DB_OPT_MYSQL_ATTR_SSL_CERT', 'C:\wamp64\bin\cloudsql\certificates\client-cert.pem'),
                    PDO::MYSQL_ATTR_SSL_KEY    => env('DB_OPT_MYSQL_ATTR_SSL_KEY', 'C:\wamp64\bin\cloudsql\certificates\client-key.pem'),
                    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => env('DB_OPT_MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', false)
                ],
            ];
        }

        return $config;
    })(),

],

您可以为此创建服务提供商:

class SSLServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot(Kernel $kernel)
    {

    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $config = \Config::get('database.connections.mysql');

        if (env('DB_WITH_SSLMODE', false)) {
            $config += [
                'sslmode' => env('DB_SSLMODE', 'prefer'),
                'options' => [
                    \PDO::MYSQL_ATTR_SSL_CA => env('DB_OPT_MYSQL_ATTR_SSL_CA',
                        'C:\wamp64\bin\cloudsql\certificates\server-ca.pem'),
                    \PDO::MYSQL_ATTR_SSL_CERT => env('DB_OPT_MYSQL_ATTR_SSL_CERT',
                        'C:\wamp64\bin\cloudsql\certificates\client-cert.pem'),
                    \PDO::MYSQL_ATTR_SSL_KEY => env('DB_OPT_MYSQL_ATTR_SSL_KEY',
                        'C:\wamp64\bin\cloudsql\certificates\client-key.pem'),
                    \PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => env('DB_OPT_MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', false)
                ],
            ];
        }

        \Config::set('database.connections.mysql', $config);

    }

}
不要忘记在config/app.php中注册您的服务提供商

App\Providers\SSLServiceProvider::class,

使用三元运算符怎么样?(几乎就像在laravel 5.8中默认完成的那样)

注意:第一种解决方案不会从配置数组中删除sslmode。如果您需要这样做,只需使用第二个选项

1) 它应该是这样工作的:

“连接”=>[
“mysql”=>[
“驱动程序”=>“mysql”,
'host'=>env('DB_host','127.0.0.1'),
'port'=>env('DB_port','3306'),
'database'=>env('DB_database','forge'),
'username'=>env('DB_username','forge'),
'password'=>env('DB_password',''),
'unix_socket'=>env('DB_socket',''),
“字符集”=>“utf8mb4”,
“排序规则”=>“utf8mb4\u unicode\u ci”,
'前缀'=>'',
“prefix_index”=>true,
“严格”=>正确,
“引擎”=>null,
'sslmode'=>env('DB_WITH_sslmode')?env('DB_sslmode','preference'):null,
'options'=>(已加载扩展名('pdo_mysql')和&env('DB_WITH_SSLMODE'))[
PDO::MYSQL\u ATTR\u SSL\u CA=>env('MYSQL\u ATTR\u SSL\u CA'),
PDO::MYSQL\u ATTR\u SSL\u CERT=>env('MYSQL\u ATTR\u SSL\u CERT'),
PDO::MYSQL\u ATTR\u SSL\u KEY=>env('MYSQL\u ATTR\u SSL\u KEY'),
PDO::MYSQL\u ATTR\u SSL\u VERIFY\u SERVER\u CERT=>env('MYSQL\u ATTR\u SSL\u VERIFY\u SERVER\u CERT'))
] : [],
],
],

2) 脏解决方案,但有一个条件:

“连接”=>[
“mysql”=>数组\u合并([
“驱动程序”=>“mysql”,
'host'=>env('DB_host','127.0.0.1'),
'port'=>env('DB_port','3306'),
'database'=>env('DB_database','forge'),
'username'=>env('DB_username','forge'),
'password'=>env('DB_password',''),
'unix_socket'=>env('DB_socket',''),
“字符集”=>“utf8mb4”,
“排序规则”=>“utf8mb4\u unicode\u ci”,
'前缀'=>'',
“prefix_index”=>true,
“严格”=>正确,
“引擎”=>null
],(已加载扩展名('pdo_mysql')和&env('DB_WITH_SSLMODE'))[
'sslmode'=>env('DB_sslmode','preference'),
“选项”=>[
PDO::MYSQL\u ATTR\u SSL\u CA=>env('MYSQL\u ATTR\u SSL\u CA'),
PDO::MYSQL\u ATTR\u SSL\u CERT=>env('MYSQL\u ATTR\u SSL\u CERT'),
PDO::MYSQL\u ATTR\u SSL\u KEY=>env('MYSQL\u ATTR\u SSL\u KEY'),
PDO::MYSQL\u ATTR\u SSL\u VERIFY\u SERVER\u CERT=>env('MYSQL\u ATTR\u SSL\u VERIFY\u SERVER\u CERT'))
]
]:[“选项”=>[]),
],
然后将env()中的默认值移动到.env文件中(请注意,我删除了DB\u OPT\u前缀):

因此,如果将DB\u WITH_SSLMODE设置为false,将返回一个空数组,并且不会启用ssl


注意:我认为您指定的sslmode仅用于PostgreSQL连接,这不是您的情况。

实际上,您也可以做一些简单的事情,如:

$database = [
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'live_db'),
            'username' => env('DB_USERNAME', 'myuser'),
            'password' => env('DB_PASSWORD', '2309423234'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => 'gn_',
            //'prefix_indexes' => true,
            'strict' => false,
            'engine' => env('DB_ENGINE', null),
        ]
    ]
];

if(env('DB_WITH_SSLMODE', false)){
    $database['connections']['mysql'] += [
        'sslmode' => env('DB_SSLMODE', 'prefer'),
        'options'   => [
            PDO::MYSQL_ATTR_SSL_CA    => env('DB_OPT_MYSQL_ATTR_SSL_CA', 'C:\wamp64\bin\cloudsql\certificates\server-ca.pem'),
            PDO::MYSQL_ATTR_SSL_CERT    => env('DB_OPT_MYSQL_ATTR_SSL_CERT', 'C:\wamp64\bin\cloudsql\certificates\client-cert.pem'),
            PDO::MYSQL_ATTR_SSL_KEY    => env('DB_OPT_MYSQL_ATTR_SSL_KEY', 'C:\wamp64\bin\cloudsql\certificates\client-key.pem'),
            PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => env('DB_OPT_MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', false)
        ]
    ];
}

return $database;


对我来说是新的知识…谢谢…我确信它在工作,但我仍然觉得这个答案不实用…所以我不能标记你的答案…但我支持这个答案…谢谢分享这个…除了在配置文件中,不要使用任何env()调用,因为如果启用配置缓存(
php artisan optimize/php artisan config:cache
)配置文件夹之外的任何env调用都将返回一个空值。@mdexp,,,,是的,这是有意义的…这意味着如果我们使用
config:cache
…这个答案不合适。对吗?对,它也在关于
'sslmode'=>env('DB_sslmode','preferred'),
中有说明吗??把它放在哪里?阅读答案底部的注释:它应该只用于PostgreSQL连接。如果你尝试那个配置,它无论如何都会工作的。实际上我需要它。。。在我的live server中,如果我删除
sslmode
,将显示错误。。。。因此,我需要
sslmode
。在我的
live server
中,我需要打开SSL…但在我的本地主机中,我需要关闭SSL。。。相信我,第一个解决方案不起作用。。。我已经试过了。。。如果我想禁用SSL,我必须删除
sslmode
属性…如果我不删除它,并且如果我只是将其设置为空值(例如
'sslmode'=>''
),它将引发错误。。但是,肮脏的(第二)解决方案正在发挥作用。。。谢谢分享…我对你的答案投了赞成票…好吧,我后来认为你需要完全删除解决方案。如果是这样的话,第二个解决方案就是要走的路。
$database = [
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'live_db'),
            'username' => env('DB_USERNAME', 'myuser'),
            'password' => env('DB_PASSWORD', '2309423234'),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix' => 'gn_',
            //'prefix_indexes' => true,
            'strict' => false,
            'engine' => env('DB_ENGINE', null),
        ]
    ]
];

if(env('DB_WITH_SSLMODE', false)){
    $database['connections']['mysql'] += [
        'sslmode' => env('DB_SSLMODE', 'prefer'),
        'options'   => [
            PDO::MYSQL_ATTR_SSL_CA    => env('DB_OPT_MYSQL_ATTR_SSL_CA', 'C:\wamp64\bin\cloudsql\certificates\server-ca.pem'),
            PDO::MYSQL_ATTR_SSL_CERT    => env('DB_OPT_MYSQL_ATTR_SSL_CERT', 'C:\wamp64\bin\cloudsql\certificates\client-cert.pem'),
            PDO::MYSQL_ATTR_SSL_KEY    => env('DB_OPT_MYSQL_ATTR_SSL_KEY', 'C:\wamp64\bin\cloudsql\certificates\client-key.pem'),
            PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => env('DB_OPT_MYSQL_ATTR_SSL_VERIFY_SERVER_CERT', false)
        ]
    ];
}

return $database;