【问题标题】:Laravel: setting the values of config file from databaseLaravel:从数据库设置配置文件的值
【发布时间】:2021-08-03 06:18:34
【问题描述】:

我已经创建了一个自定义磁盘,例如

'custom-ftp' => [
            'driver' => 'ftp',
            'host' => 'imn.tra.de',
            'username' => '',
            'password' => '',
            'port'     => 21,
            'ssl'      => true,
        ],

但我希望数据库中的每个用户都设置用户名和密码并相应地调用磁盘,

现在我正在做的是在将文件上传到 ftp 之前,我正在做

 $user = Auth::user();
    $setting = $user->setting;

    Config::set('filesystems.disk.custom-ftp.username', $setting->user_name);
    Config::set('filesystems.disk.custom-ftp.password', $setting->password);

后来

  Storage::disk('custom-ftp')->put($file, $localFile);

但我得到了 像这样:无法使用连接登录:imn.tra.de::21,用户名:因为这仍在从配置中选择用户名,它是空的

【问题讨论】:

  • 您可以将设置字段添加到用户表并从仪表板进行设置,或者您可以使用一些设置包。哪里有适合你的教程laracasts.com/lessons/managing-mass-user-settings
  • 在将文件上传到 ftp 之前,我已经在数据库中保存设置并更新配置文件,请查看我编辑的问题
  • 你的方法有什么问题?它不工作?
  • 配置文件用于静态设置。动态设置不应该以这种方式放入配置中
  • 您可以在运行时通过传递键/值对数组来设置配置变量。但是请注意,此函数仅影响当前请求的配置值,不会更新您的实际配置值: config(['app.debug' => true]); (laravel.com/docs/master/helpers#method-config)

标签: laravel


【解决方案1】:

配置文件用于静态设置,仅用于特定于应用程序的设置而不是用户。

不应将动态设置放入配置中。

您应该即时创建 FTP 驱动程序:

$ftp = Storage::createFtpDriver([
    'driver' => 'ftp',
    'host' => 'imn.tra.de',
    'username' => $setting->user_name,
    'password' => $setting->password,
    'port'     => 21,
    'ssl'      => true,
]);

$ftp->put($file, $localFile);

可重复使用的解决方案如下所示:

<?php

namespace App\Services;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;

class UserFtpStorageService
{
    public function __construct()
    {
        $userSettings = Auth::user()->settings;
        $this->ftp = Storage::createFtpDriver([
            'driver' => 'ftp',
            'host' => 'imn.tra.de',
            'username' => $userSettings->user_name,
            'password' => $userSettings->password,
            'port'     => 21,
            'ssl'      => true,
        ]);
    }

    public function put(string $path, $contents, $options = []) : bool
    {
        return $this->ftp->put($path, $contents, $options);
    }
}

然后你像这样使用它:

(new UserFtpStorageService())->put($path, $contents);

【讨论】:

  • 未来如何使用?比如说我们用它来上传文件一次,那么下次我们需要重新创建 ftpdriver 吗?
  • 你可以创建一个抽象的类,然后像这样:UserFtpStorage::put($file, $localFile)
  • @user8076689 我在答案中添加了示例
猜你喜欢
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 2014-06-23
  • 2021-03-07
  • 1970-01-01
  • 2018-07-04
  • 2015-12-25
  • 1970-01-01
相关资源
最近更新 更多