Laravel 从数据库加载设置

2023-11-24

我正在寻找一种使用 Laravel 5 从数据库加载设置/配置的有效方法。设置包括key and value列中,模型类基本上如下所示:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Setting extends Model
{
    protected $table = 'settings';
    protected $fillable = ['key', 'value'];
    protected $primaryKey = 'key';
}

首先,我做了一个简单的辅助函数来完成这项工作。问题是,这会导致每个页面请求多次调用。这变得越来越慢。

/**
 * Get the value for the given setting from the database.
 *
 * @param  string  $key
 * @return string
 */
function setting($key)
{
    $setting = Setting::whereKey($key)->firstOrFail();

    return $setting->value;
}

// $foo = setting('foo'); returns 'bar'

为了改进这一点,我创建了一个名为的自定义类SettingApp\Classes目录(并为其创建了一个 Facade):

<?php

namespace App\Classes;

use Cache;

class Setting {

    /**
     * The array of settings
     *
     * @var array $settings
     */
    protected $settings = [];

    /**
     * Instantiate the class.
     */
    public function __construct()
    {
        $this->loadSettings();
    }

    /**
     * Pull the settings from the database and cache them.
     *
     * @return void;
     */
    protected function loadSettings()
    {
        $settings = Cache::remember('settings', 24*60, function() {
            return \App\Setting::all()->toArray();
        });

        $this->settings = array_pluck($settings, 'value', 'key');
    }

    /**
     * Get all settings.
     *
     * @return array;
     */
    public function all()
    {
        return $this->settings;
    }

    /**
     * Get a setting value by it's key.
     * An array of keys can be given to retrieve multiple key-value pair's.
     *
     * @param  string|array  $key;
     * @return string|array;
     */
    public function get($key)
    {
        if( is_array($key) ) {
            $keys = [];

            foreach($key as $k) {
                $keys[$k] = $this->settings[$k];
            }

            return $keys;
        }

        return $this->settings[$key];
    }

}

// $foo = Setting::get('foo');

现在我的问题是:这是解决这个问题的最佳方法吗?我现在在构造类时缓存所有设置。然后从缓存中检索设置值。

我开始理解 L5 中的存储库模式,但还没有达到那个程度。我认为在这种情况下这太过分了。我很想听听我的方法是否有意义。


这是 Laravel 5.5 的更新答案。

首先,为您创建一个迁移settings table:

Schema::create('settings', function (Blueprint $table) {
    $table->increments('id');
    $table->string('key');
    $table->text('value')->nullable();
    $table->timestamps();
});

然后创建一个Setting model:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Setting extends Model
{
    protected $fillable = ['key', 'value'];
}

Now, in AppServiceProvider,将以下内容添加到您的boot() method:

if (Schema::hasTable('settings')) {
    foreach (Setting::all() as $setting) {
        Config::set('settings.'.$setting->key, $setting->value);
    }
}

这将创建config('settings.*')对于数据库中的每个设置,其中*是关键。

例如,插入/创建以下设置:

Setting::create([
    'key' => 'example',
    'value' => 'Hello World',
]);

现在您可以访问config('settings.example'),这会给你Hello World.

更新设置就像执行以下操作一样简单:

Setting::where('key', 'example')->update([
    'value' => 'My New Value',
]);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Laravel 从数据库加载设置 的相关文章

随机推荐

  • Javascript将数据保存到文件系统(有用户提示)

    在最新的浏览器 支持 html5 中实现以下目标的最佳方法是什么 我主要针对的是 Google Chrome 在我的应用程序中 数据是通过 JavaScript 操作的 并且需要使用浏览器提示 另存为对话框 将输出写入文件系统 我不确定写入
  • JNI:从C代码到Java和JNI

    背景 我正在 Eclipse 中开发 Android 应用程序 现在遇到问题 需要您的帮助 所以我必须调用写成的函数C来自JAVA应用程序 但在我编写代码的方式上我有一些问题您可以在下面看到 我正在等待您的答案和想法 C Code typd
  • 如何在 C# 驱动程序中设置 MongoDB Change Stream 'OperationType'?

    当运行新的 MongDB 服务器版本 3 6 并尝试将更改流监视添加到集合以获取新插入和文档更新的通知时 我只收到更新通知 而不收到插入通知 这是我尝试添加手表的默认方式 IMongoDatabase mongoDatabase mongo
  • 通过 Javascript 检测图像的 mime 类型

    我正在使用 javascript document images 函数检测网页上的图像 该函数返回图像数组 由于我没有在正在加载的图像上使用任何扩展名 有什么方法可以从中获取图像的 mime 类型吗 除了在 jQuery 中再次请求图像并尝
  • 在 Visual Studio 2010 中调试时忽略跨 AppDomain 的异常

    我在调试调用另一个 AppDomain 的应用程序时遇到问题 因为如果其他 AppDomain 正在执行的任何操作中发生异常 则异常会冒泡并导致 Visual Studio 2010 无论如何都崩溃 我已经正确包装了抛出的方法调用try c
  • 在 Django TEMPLATE DIRS 中使用外部 URL

    Settings py 中的 Django TEMPLATE DIRS 调用 unix 样式斜杠 因此 当我打电话时 get template some template html 在视图中 结果始终从根开始 并导致调用 home user
  • 如何将您的 Unity 项目输入更新到 SteamVR 2.0?

    我有一些 Unity 场景与以前版本的 SteamVR 插件配合得很好 因为有新版本的插件 SteamVR Unity Plugin 2 0 我的代码不再有效 https steamcommunity com games 250820 an
  • 在 CSS 中使用 OS 9 资源分支字体和 @font-face

    我有一些旧的 OS 9 字体 其中包含资源分支中的字体数据 当我尝试在 font face 中链接此类字体并在浏览器中打开 HTML 时 文本仍然以默认字体显示 在搜索过程中 我发现可以使用 rsrc 属性将字体数据复制到常规 ttf 文件
  • OpenMP 中 private 子句中的变量与并行区域中定义的变量之间有什么区别吗?

    我想知道是否有任何理由选择private var OpenMP 中关于 私有 变量本地定义的子句 即 int var pragma omp parallel private var vs pragma omp parallel int va
  • 更改 Rails 中的当前选项卡

    我的应用程序顶部有一个选项卡列表 我将其包含在 application html erb 的常规布局中 它们看起来像这样 li class current li li li li li 当我点击该页面时 我想将所选选项卡更改为 当前 选项卡
  • 将数据从活动发送到另一个活动而不启动它

    如果我有两个活动 Activity1 和 Activity2 并且我想在不启动 Activity2 的情况下将数据从 Activity1 发送到 Activity2 我知道如果我想启动 Activity2 我在 Activity1 java
  • 如何为基于 YAML 的管道创建管道变量?

    使用设计器 类构建管道 您可以定义具有要传递到任务中的默认值的管道变量 如何对基于 YAML 的管道执行相同的操作 我想创建三个构建管道 每个管道都有一个设置为不同值的变量 所有三个都指向一个 YAML 文件 这文档 states 您可以选
  • 如何计算两个 Rust 数组/切片/向量的点积?

    我试图找到两个向量的点积 fn main let a vec 1 2 3 4 let b a clone let r a iter zip b iter map x y Some x y gt x y sum println r 这失败了
  • 评估 if 语句中可选对象的 Bool 属性

    我正在寻找一种评估 Swift 的方法Bool简洁地概括为一个if声明 当Bool是可选对象的属性 var objectWithBool ClassWithBool if let obj objectWithBool if obj bool
  • 在 C 中如何将浮点值限制为小数点后仅两位?

    在 C 中如何将浮点值 例如 37 777779 四舍五入到小数点后两位 37 78 如果您只想对数字进行四舍五入以用于输出目的 那么 2f 格式字符串确实是正确的答案 但是 如果您实际上想要舍入浮点值以进行进一步计算 则可以使用如下所示的
  • 如何在没有 ssh 身份验证的情况下设置 git 服务器

    不久前 我偶然发现了关于如何通过 Web 服务器以某种方式设置 git 身份验证的解释 这样客户端就不需要 ssh 密钥交换 真遗憾 我既没有为其链接添加书签 也记不起该技术 我只是怀念抛出一个用户名 密码组合来访问一些一次性存储库 当对一
  • `warm_start` 参数及其对计算时间的影响

    我有一个逻辑回归具有一组定义的参数的模型 warm start True 一如既往 我打电话LogisticRegression fit X train y train 并使用之后的模型来预测新的结果 假设我改变一些参数 比如说 C 100
  • Google 是否正在为 HTML 自定义数据属性建立索引?

    我正在使用 PushState hash bangs 构建一个基于 AJAX 的投资组合模块 并且由于我排除了没有 JavaScript 的浏览器 所以我唯一关心的是 HTML 自定义数据属性在 SEO 方面的限制 例如 使用下面的代码 u
  • 按需显示或隐藏标题栏

    我想向我的 Windows 窗体应用程序 用 vb net 编写 添加一个选项 该选项将为用户提供隐藏菜单栏和标题栏的选项 我可以做菜单 但我不确定隐藏标题的最佳方法是什么 我可以将 FormBorderStyle 更改为 none 但这是
  • Laravel 从数据库加载设置

    我正在寻找一种使用 Laravel 5 从数据库加载设置 配置的有效方法 设置包括key and value列中 模型类基本上如下所示