【发布时间】:2015-12-25 19:13:11
【问题描述】:
我正在寻找一种使用 Laravel 5 从数据库加载设置/配置的有效方法。设置由 key 和 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'
为了改进这一点,我在 App\Classes 目录中创建了一个名为 Setting 的自定义类(并为它创建了一个 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 中的存储库模式,但我还没有到那里。我认为在这种情况下这将是矫枉过正。我很想听听我的方法是否有意义。
【问题讨论】:
标签: php database configuration laravel-5 settings