快速添加Laravel存储磁盘/文件系统

问题描述 投票:3回答:4

我在数据库表中保留了多个FTP帐户,希望每个帐户都可以在Laravel中用作存储磁盘。

通常,Laravel's disksconfig/filesystems.php中定义。但是,我不想在这里对我的FTP帐户进行硬编码,而是想在中间件中即时定义它们。

这可能吗?我该怎么做?

laravel filesystems storage
4个回答
4
投票

我用这种方法创建了一个服务提供者MyDiskServiceProdiver

public function boot()
{
    MyDisk::all()->each(function(MyDisk $myDisk) {
        $this->app['config']["filesystems.disks.{$myDisk->name}"] = ['driver' => $myDisk->driver] + $myDisk->config;
    });
}

config属性在数据库中为json类型,并具有多个特定于驱动程序的属性。


0
投票

您可以将FTP帐户配置存储在项目的csv文件中,然后使用laravel中的核心php将每个帐户用作存储磁盘。您有一些想法可以从此链接上传文件:https://cloudinary.com/blog/file_upload_with_php

在此$ currentDir = getcwd();中$ uploadDirectory =“ / uploads /”;您可以从CSV文件中获得这两个文件。可能会在实施正确的逻辑后为您提供帮助。


0
投票

我通过将一些原始PHP添加到配置文件(在我的情况下是数据库配置)解决了相同的问题。关键是laravel配置文件仍然只是“普通” PHP文件,因此没有什么阻止您进入此处的数据库,因为首先处理配置,所以您不能使用Eloquent。

因此,采用这种方法-您可以在通过PDO从数据库中读取磁盘后,将它们添加到配置阵列中。

未编辑的配置文件返回对象数组(因此,在您的情况下也为“磁盘”)

  1. 更改文件系统配置并将当前数组添加到名为$ staticConfig之类的明智变量中>]

    $staticConfig = 
    [
     /*the current default contents of filesystems.php
    ]
    
  2. 为数据库设置PDO(实际设置在您的.env文件中)

  3. 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);
     }
    
  4. [添加一个功能以从数据库中获取磁盘(如您在问题中所指出的那样,它在数据库中)-诸如此类(以FTP为例):

  5. 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;
    }
    
  6. 最后要做的是将动态配置添加到“静态”配置,然后像这样返回数组:

  7. $dynamicFTPS = fetchMyFTPs();
    $staticConfig['disks'] = array_merge($staticConfig['disks'],$dynamicFTPS);
    return $staticConfig
    

    这样,您仍然可以按照常规方式将配置添加到静态配置数组,并且仅从db合并到动态磁盘中。

**请注意,这绝对会对性能产生某些影响-首选文字配置。但是,在某些情况下(例如我在数据库方面也有),似乎没有其他实用方法。无论如何,此调用的“结果”都会被缓存,因此我认为数据库代码不会在每个调用中都执行。


0
投票

创建新的服务提供商php artisan make:provider FileSystemServiceProvider

© www.soinside.com 2019 - 2024. All rights reserved.