【问题标题】:Accessing new Laravel config files during request在请求期间访问新的 Laravel 配置文件
【发布时间】:2020-05-14 19:40:48
【问题描述】:

我有一个场景,在同一个传入请求期间创建和访问 Laravel 配置文件。但是,当访问新存储的配置文件的值时,config() 无法访问文件的键/值。

这是一个示例场景:


public function create(Request $request)
{
    $settings = ['foo' => 'bar'];
    // Store the config.
    Storage::disk('config')->put("settings.php", '<?php return ' . var_export($settings, true) . ';');
    // Results in an error, value not found.
    $config_value = config('settings.foo'); 
}

有没有办法在运行时重新注册 Laravel 配置文件?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    将内容保存到 php 文件 config/settings.php (显然)不是最好的方法。

    要么将配置保存到数据库,要么简单地使用 config() 帮助器来分配如下值:

    class MyConfigProvider extends ServiceProvider
    {
        public function boot() {
            $this->app->booted(function () {
                // This will set the config setting `config/settings.php['app_name']` at runtime:
                config([
                    'settings.app_name' => 'My App Name'
                ]);
            });
        }
    }
    

    然后,确保在您的config/app.php['providers'] 数组中尽早在堆栈中加载此服务提供程序。基本上它会覆盖您在config/settings.php 中设置的任何预定义配置。您甚至可以在此处从请求对象或数据库中检索值。

    【讨论】:

    • 能否请您详细说明为什么直接保存配置文件不是解决此问题的好方法? var_export() 不可信吗?
    • 我认为它可以与eval 进行比较,因为您基本上是在写入稍后执行的.php 文件。您还在更改源文件,这意味着如果您使用 Git 存储库,它将不断为该文件生成更改。
    • 我最终重写了设置逻辑以从数据库中检索设置并实施了您的服务提供商解决方法。谢谢。
    【解决方案2】:

    是的,有一种方法:

    config()->set('settings.foo', $somethingNew);
    

    然后你就可以正常阅读了:

    $config_value = config('settings.foo'); 
    

    【讨论】:

      猜你喜欢
      • 2019-05-11
      • 1970-01-01
      • 2015-11-19
      • 2015-08-02
      • 1970-01-01
      • 2020-05-17
      • 2021-04-19
      • 2016-09-20
      • 1970-01-01
      相关资源
      最近更新 更多