Laravel 5:如何将数据库值加载到config / services.php文件中?

时间:2017-07-29 05:56:26

标签: php laravel laravel-5

我有一个我正在处理的多租户应用程序,在添加社交名录包时,我尝试从数据库加载特定网站的自定义facebook client_id和client_secret。我无法真正使用env变量,因为每个站点都有自己的自定义facebook键。

似乎你无法在config / services.php文件中真正调用模型的方法,因为它可能尚未加载。我已经尝试通过请求生命周期文档解决此问题无济于事。

我还尝试创建一个服务提供程序,以便从我的Business模型的方法中获取值并将其设置为常量,但是,当它在应用程序中可用时,仍然加载了config / services.php文件

这是我希望数据库值可用的地方:

配置/ services.php

'facebook' => [
  'client_id' => \App\Business::getAppKeys()->fb_client_id,
  'client_secret' => 'your‐fb‐app‐secret',
  'redirect' => 'http://your‐callback‐url',
],

错误:

  

致命错误:在null

上调用成员函数connection()

2 个答案:

答案 0 :(得分:2)

这是我正在谈论的一个非常简单的例子。

使用以下内容,我可以在初始化应用程序的其余部分之前查询数据库,获取一些详细信息并将其写入配置文件。

了解我如何访问路线中的值?

// app/Providers/ConfigServiceProvider.php

namespace App\Providers;

use App\Models\Country;
use Illuminate\Support\ServiceProvider;

class ConfigServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $countries = Country::pluck('name', 'iso_code');
        config()->set(['app.countries' => $countries->toArray()]);
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}


// config/app.php

// ...

'providers' => [
    // ...
    App\Providers\ConfigServiceProvider::class,
    // ...
],

// ...


// routes/web.php

Route::get('config', function () {
    dd(config('app.countries'));
});

答案 1 :(得分:2)

你真的不应该这样做。从模型初始化数据库连接需要加载所有配置,并且您打算使用这些连接来定义配置。你发现自己有一个循环依赖问题。

我想建议您查看您尝试使用的社交名媛套餐。如果服务中不存在用于在运行时设置/覆盖凭据的工具,请查看您是否能够使用您自己的实现来扩展服务。我认为这将是实现你想要做的事情的唯一途径。

除此之外,配置文件应该只由标量值和数组组成,以便可以缓存它们。