Laravel实现后台管理配置信息

本文基于Laravel5.4版本,其他版本可能略有不同。
对于一个应用的配置信息,除了正常情况下设置好就不常修改的写在代码文件中以外,总还有一些会因用户、使用场景及不同时间段而需要修改的,这些信息如果也写在代码文件中,则会对普通用户造成诸多不便(大多数普通用户并不熟悉或愿意通过修改代码的方式来变更配置信息)。
对此,大多数应用程序会在管理后台提供一个在线修改配置的地方。在Laravel开发的应用中,默认一般使用config()来获取配置信息,而配置信息则以文件形式存放于config目录下,而这些文件一般不应该给予写权限,我们需要进行一些“变通”的操作:
-
在config目录建立一个配置文件,如“setting.php”,所有数据库中读取的配置通过此文件被config()读取。
- 由于“setting.php”中内容应为管理后台动态管理的内容,而此文件又不应有写(修改)权限,则需要管理后台生成一个文件到可写目录(storage),并在“setting.php”中引入。
相关代码如下:
- 建立设置表(Migration)
public function up ()
{
Schema::create('settings', function (Blueprint $table) {
$table->increments('id');
$table->string('title')->comment('配置标题');
$table->string('name')->unique()->comment('配置名称');
$table->text('value')->nullable()->comment('配置值');
$table->smallInteger('group')->unsigned()->default(0)->comment('配置分组');
$table->string('type')->default('text')->comment('配置数据类型');
$table->text('addon_options')->nullable()->comment('附加选项');
$table->unsignedInteger('sort')->default(0)->comment('排序序号');
$table->text('description')->nullable()->comment('说明');
$table->timestamps();
$table->softDeletes();
});
}
- 在后台管理settings表配置(如增加、删除、修改等)时,更新缓存
public function cache()
{
$settings = [];
$this->getSettings()->map(function ($setting) use (&$settings) {
$settings[$setting->name] = self::parseValue($setting->value, $setting->type);
});
$cache_content = '<?php return ' . var_export($settings, true) . ';';
return Storage::disk('local')->put('settings.php', $cache_content);
}
相关调用代码不再给出,主要逻辑就是:
- 获取settings表中有效数据
- 生成与config目录下其他配置文件相同规则的数组
- 用var_export()生成一个php文件内容,并写入到Storage的本地磁盘的settings.php中(本应用生成的文件目录为:storage/app/settings.php)
如我的测试环境中生成的settings.php如下图:
在项目中则可使用
config('setting.index_title')
来获取首页标题。
- 在config/setting.php中引用settings.php
config/setting.php代码:
<?php
$cfg_file = storage_path('app/settings.php');
return file_exists($cfg_file) ? require $cfg_file : [];
判断文件是否存在再require,以免因项目初始化时settings.php不存在而引起运行错误。
以上是通过与Laravel配置文件相同的方式实现配置后台管理的方式,另外还可通过中间件,在应用的业务代码执行前,用config()将settings表中的配置生成数组后(或从缓存中读取)进行注入,只是将上文config/setting.php的环节换成一个中间件来执行。
本文仅提供思路,具体完整的管理代码请自行解决。
- 没有任何评论