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