delatbabel / site-config
一个基于数据库的配置加载器,用于Laravel,具有针对每个站点的配置。
Requires
- php: >=5.4.0
- laravel/framework: <5.4
Requires (Dev)
- orchestra/testbench: 3.3.*
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2024-09-10 18:56:03 UTC
README
一个基于数据库的配置加载器,用于Laravel,具有针对每个站点的配置。
此项目处于早期开发阶段,使用风险自担 -- 大多数功能现在已正常工作和测试,尽管phpUnit测试用例无法在模块中运行。我在一个示例应用程序中嵌入了一些codeception测试,但尚未发布。
特性
- 添加一个网站表,用于存储可能因网站而异的网站数据。
- 添加一个配置表,用于存储可能动态变化或根据每个网站或环境变化的系统配置数据。
- 包含一个引导器,将数据库存储的配置加载到您的网站配置中,并将其与从正常Laravel配置文件中加载的配置合并。因此,您可以像访问正常的Laravel配置一样访问存储的配置,例如。
// Access all configuration variables including Laravel + database stored configuration $config = config()->all(); // Fetch a config variable by path $my_fruit = config('config.fruit');
- 数据库支持的配置缓存最多60分钟,以减少对数据库的总体访问量。
安装
使用命令行通过composer添加包
composer require delatbabel\site-config
或者,手动拉取包,将这些行添加到您的composer.json文件中
"require": {
"delatbabel/site-config": "~1.0"
},
完成此操作后,运行composer update命令
composer update
注册服务提供者
在composer update完成后,将此行添加到您的config/app.php文件中的'providers'数组
Delatbabel\SiteConfig\SiteConfigServiceProvider::class,
将外观添加到别名中
在config/app.php中,将此行添加到aliases数组
'SiteConfigSaver' => Delatbabel\SiteConfig\Facades\SiteConfigSaver::class,
引导配置加载器
修改app/Console/Kernel.php和app/Http/Kernel.php中的每个文件,包括以下引导器函数
protected function bootstrappers() { $bootstrappers = parent::bootstrappers(); // Add the SiteConfig bootstrapper to the end. $bootstrappers[] = 'Delatbabel\SiteConfig\Bootstrap\LoadConfiguration'; return $bootstrappers; }
请注意,Delatbabel\SiteConfig\Bootstrap\LoadConfiguration放置在正常引导器之后。当然,您可能已经在Kernel.php文件中有一个具有其他引导器的引导器函数,在这种情况下,您只需要修改它以包含更新的LoadConfiguration引导器代码。
合并并运行迁移
最后,合并并运行迁移脚本以创建数据库表,如下所示
php artisan vendor:publish --tag=migrations --force php artisan migrate
在database/seeds中有一些示例种子。您可以将这些种子复制并用作您自己的应用程序中种子模板的基础。它们显示了如何为全局配置以及每个网站和环境的配置填充网站表和配置表。
待办事项
- 更多测试,修复错误。我试图使用orchestra/testbench创建测试套件,但它似乎不起作用。
- 可能有一组管理控制器/方法用于更新配置。
架构
本节解释了该包的架构以及我在编码时所做的决定。
设计目标
看到一些为Laravel 4提供数据库支持配置的包后,我想为Laravel 5找到类似的东西(我之前为Laravel 3开发过类似的系统)。我还希望配置存储在单个数据库中,但根据每个网站和环境进行变量化。
我还希望配置与基本Laravel配置集成。我看到的其他包都有自己的外观,因此访问配置的方式如下
$var1 = config('mycode.mykey'); // Or use the facade Config::get('mycode.mykey'); $var2 = DbConfig::get('mycode.mykey');
我希望将两者集成,这样我就可以使用Config::get()而不论配置数据来自哪里。这意味着我必须在引导器中加载所有配置数据。
引导
Laravel 包含一个名为 Illuminate\Foundation\Http\Kernel 的类,用于处理 Http 模式下应用程序的启动,还有一个类似的类用于控制台模式的启动。这两个类通常分别在 App\Http\Kernel 和 App\Console\Kernel 类中被扩展。
这些类中每个都加载了一大批需要启动的核心类,包括 Laravel 的日志记录器。
每个类都包含一个 $bootstrappers 数组,其中包含要启动的类列表,以及一个 bootstrappers() 函数,它返回该数组的所有内容。最初我覆盖了 $bootstrappers 数组,但发现它在 Laravel 的不同补丁版本中有所不同,因此我扩展了 bootstrappers() 函数(或者至少提供了扩展它的文档),使其返回 $bootstrappers 数组的修改版本。
最初我试图覆盖 Laravel 提供的 LoadConfiguration 启动器,但在 Laravel 的启动顺序中,它发生在数据库和门面可用之前。所以最后我不得不创建一个新的 LoadConfiguration 启动器,并将其添加到 $bootstrappers 数组的末尾,以确保它在数据库可用后运行。
仓库
Repository 类,ConfigLoaderRepository,包含足够的信息来从数据库中加载当前配置,包括了解当前的网站和环境。环境以及网站的检测,以及为通用网站和环境加载配置的实际机制,留给 Model 类处理。ConfigLoaderRepository 类还处理所有缓存。
ConfigSaverRepository 类包含足够的信息来知道在将配置数据保存到数据库时应存储哪些配置值,并在保存后重新加载它。
这区分了业务逻辑(决定要做什么,并请求执行)和数据库模型(加载数据或保存数据而不做出逻辑决策)。
模型
模型类遵循标准的 Laravel 范式,但我添加了一些额外的功能来按需提取配置数据。
感谢 StackOverflow DBA 小组的朋友们帮助解决我在 fetchSettings 查询中遇到的问题,也感谢 hailwood,我从 Models\Config::set() 函数中提取了他的逻辑。如上所述,应该有一些额外的逻辑来帮助保存配置数据,以及一些需要开发的测试用例。
致谢
这两个包都是为 Laravel 4 开发的,但提供了一些想法