即时添加Laravel存储磁盘/文件系统

时间:2018-05-16 11:32:35

标签: laravel filesystems storage

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

通常,Laravel's disksconfig/filesystems.php中定义。但是我没有在那里硬编码我的FTP帐户,而是想在运行中(在中间件中)定义它们。

这可能吗?我该如何做到这一点?

5 个答案:

答案 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从数据库读取磁盘后,将磁盘添加到配置阵列中。

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

  1. 更改文件系统配置,然后将当前数组添加到一个名为$ staticConfig

    的变量中。
    $staticConfig = 
    [
     /*the current default contents of filesystems.php
    ]
    
  2. 为您的数据库设置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);
     }
    
  3. 添加一个从数据库中获取磁盘的功能(如您在问题中所提到的,它在数据库中)-类似于以下内容(以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;
    }
    
  4. 最后要做的是将动态配置添加到“静态”配置中,然后像这样返回数组:

    $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 存储桶的连接,则非常方便。

>