我在数据库表中保留了多个FTP帐户,并希望每个帐户都可以作为Laravel中的存储磁盘使用。
通常,Laravel's disks在config/filesystems.php
中定义。但是我没有在那里硬编码我的FTP帐户,而是想在运行中(在中间件中)定义它们。
这可能吗?我该如何做到这一点?
答案 0 :(得分:2)
我使用此方法创建了服务提供者MyDiskServiceProdiver
:
public function boot()
{
MyDisk::all()->each(function(MyDisk $myDisk) {
$this->app['config']["filesystems.disks.{$myDisk->name}"] = ['driver' => $myDisk->driver] + $myDisk->config;
});
}
config
属性在数据库中的类型为json,并包含多个特定于驱动程序的属性。
答案 1 :(得分:2)
创建新的服务提供商
php artisan make:provider FileSystemServiceProvider
在config/app.php
中注册提供商
如果打开Laravel随附的config/app.php
文件,则会看到provider's array
。在此处注册创建的服务提供商。
在创建的服务提供商的The Boot Method
中,使用下面提到的代码注册磁盘
假设fileSystemsDetails
是型号名称
public function boot() {
DomainSettings::all()->each(function(DomainSettings $myDisk) {
if (!is_null($myDisk->driver_name) && !is_null($myDisk->driver_type)
&& !is_null($myDisk->driver_host) && !is_null($myDisk->driver_username) && !is_null($myDisk->driver_password)) {
$this->app['config']["filesystems.disks.{$myDisk->driver_name}"] =
[ 'driver' => $myDisk->driver_type,
'host' => $myDisk->driver_host,
'username' => $myDisk->driver_username,
'password' => $myDisk->driver_password,
'root' => $myDisk->driver_root,
];
}
});
}
答案 2 :(得分:0)
您可以将FTP帐户配置存储在项目中的csv文件中,然后使用laravel中的核心php将每个帐户用作存储磁盘。你有一些想法从这个链接上传文件: https://cloudinary.com/blog/file_upload_with_php
在这个$ currentDir = getcwd(); $ uploadDirectory =" / uploads /&#34 ;; 你可以从CSV文件中获取这两个文件。 可能这可以帮助您实现正确的逻辑。
答案 3 :(得分:0)
我通过将一些原始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合并到动态磁盘中即可。
**请注意,这绝对会对性能产生某些影响-首选文字配置。但是,在某些情况下(例如我在数据库方面也有),似乎没有其他实用方法。无论如何,此调用的“结果”都会被缓存,因此我认为数据库代码不会在每个调用中都执行。
答案 4 :(得分:0)
Laravel 的 FilesystemManager 具有创建最常见磁盘的方法。
<?php
use Illuminate\Filesystem\FilesystemManager;
$fsMgr = new FilesystemManager(app());
// local disk
$localDisk = $fsMgr->createLocalDriver(['root' => "/path/to/root"]);
// FTP disk
$ftpDisk = $fsMgr->createFtpDriver([/* FTP options */]);
// SFTP disk
$sftpDisk = $fsMgr->createSftpDriver([/* SFTP options */]);
// S3 disk
$s3Disk = $fsMgr->createS3Driver([/* S3 options */]);
除此之外,您还可以创建您的联盟/flysystem 安装支持的任何文件系统,您只需要将其包装在 Illuminate\Filesystem\FilesystemAdapter 中:
<?php
use League\Flysystem\FilesystemInterface;
// create any Flysystem instance and wrap it in Laravel's adapter
$myDisk = new FilesystemAdapter(/* \League\Flysystem\FilesystemInterface */ $filesystem);
通过这种方式,您可以即时创建磁盘,无需修改应用程序配置,如果您有大量连接,例如与合作伙伴的 FTP/SFTP 服务器、GCloud 或 S3 存储桶的连接,则非常方便。
>