Добавить диск / файловую систему Laravel на лету - PullRequest
0 голосов
/ 16 мая 2018

Я храню несколько учетных записей FTP в таблице базы данных и хотел бы, чтобы каждая из них была доступна как диск хранения в Laravel.

Обычно Диски Laravel определены в config/filesystems.php.Но вместо того, чтобы жестко кодировать мои учетные записи FTP, я хотел бы определить их на лету (в промежуточном программном обеспечении).

Возможно ли это?Как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Я создал поставщика услуг 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 голосов
/ 23 февраля 2019

Я решил ту же проблему, добавив немного ванильного 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), кажется, нет другого практического пути. «Результаты» этого вызова все равно кэшируются, поэтому я не думаю, что код БД будет выполняться при каждом вызове.

0 голосов
/ 17 мая 2018

Вы можете сохранить свои настройки учетных записей FTP в файле csv в своем проекте, а затем использовать каждую учетную запись в качестве диска для хранения, используя основной php в laravel. у вас есть идея загрузить файл по этой ссылке: https://cloudinary.com/blog/file_upload_with_php.

в этом $ currentDir = getcwd (); $ uploadDirectory = "/ uploads /"; Вы можете получить эти два файла из файла CSV. Может быть, это поможет вам после реализации правильной логики.

...