我在数据库表中保留了多个FTP帐户,希望每个帐户都可以在Laravel中用作存储磁盘。
通常,Laravel's disks在config/filesystems.php
中定义。但是,我不想在这里对我的FTP帐户进行硬编码,而是想在中间件中即时定义它们。
这可能吗?我该怎么做?
我用这种方法创建了一个服务提供者MyDiskServiceProdiver
:
public function boot()
{
MyDisk::all()->each(function(MyDisk $myDisk) {
$this->app['config']["filesystems.disks.{$myDisk->name}"] = ['driver' => $myDisk->driver] + $myDisk->config;
});
}
config
属性在数据库中为json类型,并具有多个特定于驱动程序的属性。
您可以将FTP帐户配置存储在项目的csv文件中,然后使用laravel中的核心php将每个帐户用作存储磁盘。您有一些想法可以从此链接上传文件:https://cloudinary.com/blog/file_upload_with_php。
在此$ currentDir = getcwd();中$ uploadDirectory =“ / uploads /”;您可以从CSV文件中获得这两个文件。可能会在实施正确的逻辑后为您提供帮助。
我通过将一些原始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合并到动态磁盘中。
**请注意,这绝对会对性能产生某些影响-首选文字配置。但是,在某些情况下(例如我在数据库方面也有),似乎没有其他实用方法。无论如何,此调用的“结果”都会被缓存,因此我认为数据库代码不会在每个调用中都执行。
创建新的服务提供商php artisan make:provider FileSystemServiceProvider