Я решил ту же проблему, добавив немного ванильного PHP в файл конфигурации (в моем случае это конфигурация базы данных). Дело в том, что файлы конфигурации laravel по-прежнему являются просто «обычными» файлами PHP, поэтому ничто не мешает вам получить доступ к вашей базе данных здесь, вы просто не можете использовать Eloquent, так как конфигурация обрабатывается первой.
Таким образом, при таком подходе вы можете просто добавить свои диски в массив конфигурации после чтения их из базы данных через PDO.
Неотредактированный файл конфигурации возвращает массив объектов (так что в вашем случае также «диски»)
Измените конфигурацию файловой системы и добавьте текущий массив в переменную, называемую чем-то разумным, например $ staticConfig
$staticConfig =
[
/*the current default contents of filesystems.php
]
Настройка PDO для вашей базы данных (реальная настройка будет в вашем .env файле)
function get_db_pdo()
{
$host = env('DB_HOST', '127.0.0.1');
$db = env('DB_DATABASE', '3306');
$user = env('DB_USERNAME', 'your username');
$pass = env('DB_PASSWORD', '');
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
return new PDO($dsn, $user, $pass, $opt);
}
Добавьте функцию для извлечения ваших дисков из вашей БД (как вы указали в своем вопросе, она находится в БД) - что-то вроде этого (на примере FTP):
function fetchMyFTPs() {
$db = get_db_pdo();
$ftpList = [];
$sql = 'SELECT * FROM myftpservers';
foreach ($db->query($sql) as $row) {
$newConnection = [
'driver' => 'ftp',
'host' => $row['ftpserver'],
'username' => $row['ftpusername'],
'password' => $row['ftppassword']
];
$ftpList[$row['my_ft_connection_name']] = $newConnection;
}
return $ftpList;
}
Последнее, что нужно сделать, это добавить динамический конфиг в «статический» конфиг и вернуть массив следующим образом:
$dynamicFTPS = fetchMyFTPs();
$staticConfig['disks'] = array_merge($staticConfig['disks'],$dynamicFTPS);
return $staticConfig
Таким образом, вы все равно можете добавить конфиг как обычно в массив статического конфига и просто объединить ваши динамические диски из базы данных.
** Обратите внимание, что это определенно повлияет на производительность - предпочтительной является буквальная конфигурация. Тем не менее, в некоторых случаях (как я также имел на стороне DB), кажется, нет другого практического пути. «Результаты» этого вызова все равно кэшируются, поэтому я не думаю, что код БД будет выполняться при каждом вызове.