有没有一种合理的方式来堆叠Laravel 5.7配置文件?

时间:2019-02-22 15:39:27

标签: laravel config laravel-5.7

我有一个可以运行同一站点的多个变体的代码库。是否有一种整齐的方法来使配置文件相互扩展,以便我可以拥有一个带有多个子级的父配置文件,而这些子级可以覆盖特定值?

这样的事情,

config/site.php
  return [
    'foo' => 10,
    'bar' => 20,
    'baz' => 30
  ];

config/site1/site.php
  return [
    'foo' => 5,
  ];

config/site2/site.php
  return [
    'baz' => 99
  ];

可以让您重新获得以下值

 echo config('site1.site.foo'); // 5  - from site1/site.php
 echo config('site1.site.bar'); // 20 - from site.php
 echo config('site1.site.baz'); // 30 - from site.php

 echo config('site2.site.foo'); // 10 - from site.php
 echo config('site2.site.bar'); // 20 - from site.php
 echo config('site2.site.baz'); // 99 - from site2/site.php

感觉我缺少一个简单的答案...

2 个答案:

答案 0 :(得分:0)

现在,我唯一能想到的就是假设您有多个实例。

1)在您的环境变量中添加CLIENT=site1

2)创建一个配置文件,例如: tenant.php

return [
   'folder' => env('CLIENT', 'default')
]; 

3)当您需要其中一个客户端的特定配置文件时:

config(config('tenant.folder')'.site.baz');

4)如果baz不存在时需要默认值

config(config('tenant.folder')'.site.baz', 'default.site.baz');

更好的方法是创建一个设置数据库,您可以将其缓存并与助手一起使用(例如:$baz = settings('baz', 'default');

答案 1 :(得分:0)

我将创建一个执行租户感知配置的全局函数,如下所示:

function configWithTenant($tenant='', $configPath) {
   if (empty($tenant)) {
    return config($configPath);
   }

   return config("$tenant.$configpath");
}

因此,当您调用此函数时,如果未传入任何租户,它将读取默认的site,否则它将读取tenant1.site