【问题标题】:Laravel 5: How can I load database values into the config/services.php file?Laravel 5:如何将数据库值加载到 config/services.php 文件中?
【发布时间】:2018-01-05 06:02:36
【问题描述】:

我正在开发一个多租户应用程序,在添加社交名流包时,我尝试从数据库中为特定网站加载自定义 facebook client_id 和 client_secret。我不能真正使用环境变量,因为每个站点都有自己的自定义 facebook 键。

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

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

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

config/services.php

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

错误:

致命错误:在 null 上调用成员函数 connection()

【问题讨论】:

  • 你可以把问题转过来,创建一个ConfigServiceProvider,在数据库中查询你需要的值,然后将它们写入一个配置文件。
  • @fubar 我已经尝试过了,但配置值仍然无法按时提供给服务配置文件。有没有办法改变配置文件夹中文件的加载顺序?
  • 我不明白你的意思?配置文件应该可以从服务提供者读取和写入。
  • 我的意思是,如果我检查 dd(config('settings.fb'));在 config/services.php 文件中,我发现它为 null,但它在控制器中可用,这意味着它是在需要后设置的
  • 我添加了一个答案来说明我的建议。

标签: php laravel laravel-5


【解决方案1】:

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

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

看看我如何能够访问路由中的值?

// 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'));
});

【讨论】:

  • 这一切都很好,但是您是否尝试过在我需要的 config/services.php 文件中删除 config('app.countries') ?我已经完成了,它是空的。它在我的路由和控制器中可用,但在我的 config/services.php 文件中不可用...这意味着在我的情况下,社交名流将收到 null 作为 facebook 客户端 ID。
  • 您不在控制器中使用社交名流吗?如果是这样,使用上述方法,您应该能够在需要之前设置驱动程序配置值。这就是我试图证明的。为什么你在配置文件中是dd()
  • 我使用 dd() 来查看配置文件中的变量是否已成功加载到 config/services.php 中,然后再继续执行其他步骤。让我完成整个包的配置,看看结果是什么,因为另一种选择可能是直接在 vendor\laravel\socialite\src\SocialiteManager.php 中实际设置配置值
  • 据我所知,配置文件是在服务提供商之前加载的。所以如果你dd()配置文件中的值,它将是null,因为服务提供者还没有被调用。如果您在使用之前dd() 的值,那么它应该已经设置好了。
  • 我试过了,不幸的是它不起作用。我不得不直接在社交名流包本身中使用我们在服务提供商中设置的配置文件变量,之后我就成功了。这很脏,我知道,但我现在别无选择。似乎如果我们在服务提供者中设置的配置文件确实可用,我们也应该能够在 config/services.php 文件中对其进行 dd() 操作。它只是在需要的时候不可用。感谢您花时间回复。如果你找到更干净的东西,请告诉我。
【解决方案2】:

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

我想建议您查看一下您尝试使用的社交名流包。如果服务中不存在在运行时设置/覆盖凭据的工具,请查看您是否能够使用自己的实现来扩展服务,该实现确实允许这样做。我认为这将是完成你想做的事情的唯一方法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-04
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多