Laravel 5 将配置存储在Laravel中的数据库中

Laravel 5 将配置存储在Laravel中的数据库中,laravel-5,config,Laravel 5,Config,我目前正在使用Laravel 5.2。我希望能够在数据库中存储配置属性(键值对),我愿意在运行时从我的应用程序和控制台(无论是php-artisan命令还是Tinker)访问这些属性 我最好的选择是什么 .env是一种方式,但它不是存储在数据库中,而是存储在文件中 Config::get是另一种方式,但它也写入文件。是否可以将其配置为写入数据库 Cache::get设置为与数据库一起使用,但它是临时的,而不是永久的,因此不存在问题 我之所以对数据库配置感兴趣,是因为我们经常在部署期间替换/删

我目前正在使用Laravel 5.2。我希望能够在数据库中存储配置属性(键值对),我愿意在运行时从我的应用程序和控制台(无论是
php-artisan
命令还是
Tinker
)访问这些属性

我最好的选择是什么

  • .env
    是一种方式,但它不是存储在数据库中,而是存储在文件中
  • Config::get
    是另一种方式,但它也写入文件。是否可以将其配置为写入数据库
  • Cache::get
    设置为与数据库一起使用,但它是临时的,而不是永久的,因此不存在问题
我之所以对数据库配置感兴趣,是因为我们经常在部署期间替换/删除文件。另外,最好存储加密的值。这里的另一个重要功能是能够通过
php artisan
tinker

  • 进行迁移:
    php artisan Make:migration CreateSettingsTable
  • 请注意,我在模型中添加了get和set函数,以及一个静态
    $settings
    变量,以保持示例的小型化。通常我会选择创建一个存储库或服务(而不是serviceprovider)来处理这些功能。这样,对于所有设置,您只需查询一次db(每个请求)。你可以把它放在缓存里,但这不是现在答案的一部分

  • 运行
    php artisan migrate
    在数据库中对表进行ge

  • 运行
    composer dump autoload
    ,确保tinker可以找到
    设置

  • 使用诸如
    php artisan tinker
    ()之类的工具来测试它,在这种情况下,您可以执行以下操作:


  • 我希望有帮助!:)

    我扩展了Rob Biermann方法来处理json数据

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Support\Arr;
    
    class Setting extends Model
    {
        use HasFactory;
    
        protected $casts = [
            'value' => 'array'
        ];
    
        protected $fillable = [
            'key',
            'value'
        ];
    
        /**
         * @var Setting[]|\Illuminate\Database\Eloquent\Collection|null
         */
        static public $settings = null;
    
        static function getAll(string $key, $default = null){
            if (empty(self::$settings)) {
                self::$settings = self::all();
            }
            $keys = explode('.', $key);
            $databaseKey = $keys[0];
            unset($keys[0]);
            $model = self
                ::$settings
                ->where('key', $databaseKey)
                ->first();
            if (empty($model)) {
                if (empty($default)) {
                    //Throw an exception, you cannot resume without the setting.
                    throw new \Exception('Cannot find setting: ' . $key);
                } else {
                    return $default;
                }
            } else {
                return $model->value;
            }
        }
    
        static function get(string $key, $default = null)
        {
            if (empty(self::$settings)) {
                self::$settings = self::all();
            }
            $keys = explode('.', $key);
            $databaseKey = $keys[0];
            unset($keys[0]);
            $model = self
                ::$settings
                ->where('key', $databaseKey)
                ->first();
            if (empty($model)) {
                if (empty($default)) {
                    //Throw an exception, you cannot resume without the setting.
                    throw new \Exception('Cannot find setting: ' . $key);
                } else {
                    return $default;
                }
            } else {
                if(!empty( $keys)){
                    return Arr::get($model->value, implode('.',$keys));
                }
                if(is_string( $model->value)){
                    return $model->value;
                }
                if(Arr::has($model->value, 'default')){
                    return $model->value['default'];
                }
    
                return $model->value;
    
            }
        }
    
        static function set(string $key, $value)
        {
            if (empty(self::$settings)) {
                self::$settings = self::all();
            }
    
            $keys = explode('.', $key);
            $databaseKey = $keys[0];
            unset($keys[0]);
    
            $model = self
                ::$settings
                ->where('key', $databaseKey)
                ->first();
    
            if (empty($model)) {
                if(!empty($keys)){
                    $array = [];
                    $model = self::create([
                        'key' => $key,
                        'value' => Arr::set($array, implode('.',$keys), $value)
                    ]);
                }
                else{
                    $model = self::create([
                        'key' => $key,
                        'value' => $value
                    ]);
                }
    
                self::$settings->push($model);
            } else {
                if(!empty($keys)){
                    $old = $model->value;
                    if(is_string($old)){
                        $old = ["default" => $old] ;
                    }
                    if(Arr::has($old, implode('.',$keys))){
                        $old = Arr::set($old, implode('.',$keys), $value);
                    }
                    else{
                        $old = Arr::add($old, implode('.',$keys), $value);
                    }
    
                    $model->update(['value' => $old]);
                }
                else{
                    if(is_array($model->value)){
                        $new = $model->value;
                        $new['default'] = $value;
                        $value = $new;
                    }
                    $model->update(['value' => $value]);
    
                }
    
            }
            return true;
        }
    
    
    }
    

    有趣的想法是,我曾经参与过一个项目,之前有一个db配置解决方案。基本上,我们有一个包含两个字段的表:
    key
    value
    。然后我们为这个表建立了一个模型(即
    DBConfig
    ),并使用像
    DBConfig::where('key',$yourKey)->first()这样的值
    这样您就可以对常规配置选项使用config()(需要从ofc文件加载db设置),而对只在db中找到的配置使用DBConfig。如果你想让我详细阐述这个想法,我会把它作为一个答案发布:)@RobBiermann是的,这是个好主意。我想把它看作是一个答案
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Setting extends Model
    {
        protected $fillable = [
            'key',
            'value'
        ];
    
        //I would normally do this in a repository,
        // but for simplicity sake, i've put it in here :)
        static public $settings = null;
    
        static function get($key, $default = null)
        {
            if (empty(self::$settings)) {
                self::$settings = self::all();
            }
            $model = self
                ::$settings
                ->where('key', $key)
                ->first();
            if (empty($model)) {
                if (empty($default)) {
                    //Throw an exception, you cannot resume without the setting.
                    throw new \Exception('Cannot find setting: '.$key);
                }
                else {
                    return $default;
                }
            }
            else {
                return $model->value;
            }
        }
    
        static function set(string $key, $value)
        {
            if (empty(self::$settings)) {
                self::$settings = self::all();
            }
            if (is_string($value) || is_int($value)) {
                $model = self
                    ::$settings
                    ->where('key', $key)
                    ->first();
    
                if (empty($model)) {
                    $model = self::create([
                        'key' => $key,
                        'value' => $value
                    ]);
                    self::$settings->push($model);
                }
                else {
                    $model->update(compact('value'));
                }
                return true;
            }
            else {
                return false;
            }
        }
    }
    
    
    Setting::set('someKey', 'someValue'); //Set someKey to someValue
    Setting::get('someKey'); //Get someKey, throws exception if not found
    Setting::get('somekey2', 'someDefault'); //Shows someDefault because somekey2 is not set yet.
    
    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Support\Arr;
    
    class Setting extends Model
    {
        use HasFactory;
    
        protected $casts = [
            'value' => 'array'
        ];
    
        protected $fillable = [
            'key',
            'value'
        ];
    
        /**
         * @var Setting[]|\Illuminate\Database\Eloquent\Collection|null
         */
        static public $settings = null;
    
        static function getAll(string $key, $default = null){
            if (empty(self::$settings)) {
                self::$settings = self::all();
            }
            $keys = explode('.', $key);
            $databaseKey = $keys[0];
            unset($keys[0]);
            $model = self
                ::$settings
                ->where('key', $databaseKey)
                ->first();
            if (empty($model)) {
                if (empty($default)) {
                    //Throw an exception, you cannot resume without the setting.
                    throw new \Exception('Cannot find setting: ' . $key);
                } else {
                    return $default;
                }
            } else {
                return $model->value;
            }
        }
    
        static function get(string $key, $default = null)
        {
            if (empty(self::$settings)) {
                self::$settings = self::all();
            }
            $keys = explode('.', $key);
            $databaseKey = $keys[0];
            unset($keys[0]);
            $model = self
                ::$settings
                ->where('key', $databaseKey)
                ->first();
            if (empty($model)) {
                if (empty($default)) {
                    //Throw an exception, you cannot resume without the setting.
                    throw new \Exception('Cannot find setting: ' . $key);
                } else {
                    return $default;
                }
            } else {
                if(!empty( $keys)){
                    return Arr::get($model->value, implode('.',$keys));
                }
                if(is_string( $model->value)){
                    return $model->value;
                }
                if(Arr::has($model->value, 'default')){
                    return $model->value['default'];
                }
    
                return $model->value;
    
            }
        }
    
        static function set(string $key, $value)
        {
            if (empty(self::$settings)) {
                self::$settings = self::all();
            }
    
            $keys = explode('.', $key);
            $databaseKey = $keys[0];
            unset($keys[0]);
    
            $model = self
                ::$settings
                ->where('key', $databaseKey)
                ->first();
    
            if (empty($model)) {
                if(!empty($keys)){
                    $array = [];
                    $model = self::create([
                        'key' => $key,
                        'value' => Arr::set($array, implode('.',$keys), $value)
                    ]);
                }
                else{
                    $model = self::create([
                        'key' => $key,
                        'value' => $value
                    ]);
                }
    
                self::$settings->push($model);
            } else {
                if(!empty($keys)){
                    $old = $model->value;
                    if(is_string($old)){
                        $old = ["default" => $old] ;
                    }
                    if(Arr::has($old, implode('.',$keys))){
                        $old = Arr::set($old, implode('.',$keys), $value);
                    }
                    else{
                        $old = Arr::add($old, implode('.',$keys), $value);
                    }
    
                    $model->update(['value' => $old]);
                }
                else{
                    if(is_array($model->value)){
                        $new = $model->value;
                        $new['default'] = $value;
                        $value = $new;
                    }
                    $model->update(['value' => $value]);
    
                }
    
            }
            return true;
        }
    
    
    }
    
    Setting::get('someKey.key');
    Setting::get('someKey.key.key1');
    Setting::set('someKey.key', 'test');
    Setting::set('someKey.key.key1', 'test');