Laravel动态配置设置

Cou*_*all 24 php laravel laravel-5 laravel-5.2

我在我的项目中使用了一个包,它在里面存储了一个设置 config/packagename

我想在配置文件中动态更改此值,这是文件结构当前的外观;

<?php

return [
    'view_id' => '118754561',

    'cache_lifetime_in_minutes' => 60 * 24,
];
Run Code Online (Sandbox Code Playgroud)

我想把它改成这样的东西 -

'view_id' => Auth::user()->id,
Run Code Online (Sandbox Code Playgroud)

您可以在配置文件中执行此操作,还是必须存储某种变量以便稍后在控制器中更新.有没有办法将这些变量放在env文件中并从控制器访问这些新变量?

mat*_*iku 21

这也是动态更新.env文件通用解决方案(各自的键/值对)

  1. 更改config/packagename中的设置,如下所示:
return [
    'view_id' => env('VIEW_ID', '118754561'),
    etc...
]
Run Code Online (Sandbox Code Playgroud)
  1. 在.env中添加初始值:

    VIEW_ID = 118754561

  2. 在适当的控制器(例如AuthController)中,使用下面的代码并像这样调用函数: updateDotEnv('VIEW_ID', Auth::User()->id)

    protected function updateDotEnv($key, $newValue, $delim='')
    {
    
        $path = base_path('.env');
        // get old value from current env
        $oldValue = env($key);
    
        // was there any change?
        if ($oldValue === $newValue) {
            return;
        }
    
        // rewrite file content with changed data
        if (file_exists($path)) {
            // replace current value with new value 
            file_put_contents(
                $path, str_replace(
                    $key.'='.$delim.$oldValue.$delim, 
                    $key.'='.$delim.$newValue.$delim, 
                    file_get_contents($path)
                )
            );
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

(如果你想使这个函数更通用,以便在.env中使用key = value对,那么$ delim参数是必需的,其中值必须用双引号括起来,因为它们包含空格).

不可否认,如果您在项目中同时使用此程序包的多个用户,这可能不是一个好的解决方案.所以这取决于你使用这个包的内容.

注意:如果您打算从其他课程中使用它,您需要将该功能公之于众.


las*_*203 11

从 Laravel v5.2 开始,您可以通过这种方式动态设置配置值:

<?php

config(['app.timezone' => 'America/Chicago']);

$value = config('app.timezone');

echo $value;
// output: 'America/Chicago'
Run Code Online (Sandbox Code Playgroud)


Nar*_*r P 8

Laravel框架的所有配置文件都存储在该app/config目录中。

因此,如果需要创建自定义配置值,最好将自定义配置保留在自定义文件中。因此我们需要在中创建自定义文件app/config directory

Laravel会自动将此文件读取为配置文件,并将对其进行自动管理。在本主题中,我们正在laravel中使用自定义配置,并在控制器或视图中获取配置值。

现在,我将解释如何在Laravel中创建自定义配置文件,以便我们可以在此之上实现动态功能。

创建一个app/config/custom.php具有配置键和值的文件,例如:

return array(
  'my_val' => 'mysinglelue',
  'my_arr_val' => array('1', '2', '3'),
);
Run Code Online (Sandbox Code Playgroud)

现在需要在视图/控制器中获取这些配置值,因此我们将get()为此使用Config类方法

句法:

echo Config::get('filename.arraykey');
Run Code Online (Sandbox Code Playgroud)

这里filenameconfig file’s name,风俗在我们的情况下,和关键是array key你想访问的价值。

在我们的情况下将是:

echo Config::get('custom.my_val');
Run Code Online (Sandbox Code Playgroud)

在laravel中创建运行时配置:

在运行时设置的配置值将为当前请求设置,而不会将其传递到后续请求。

您可以在此处传递动态值,以便可以使用isset()函数在此处动态修改配置文件。

就像isset()在相同条件下建议使用@Kundan roy一样。但这是另一种方法,可用于在配置中动态设置值。

Config::set('custom.my_val', 'mysinglelue');
Run Code Online (Sandbox Code Playgroud)

因此,通过使用此方法,您可以根据所需的值创建动态配置文件。

  • 你提到的是对的。但是在我的项目中,我仅在`Config::set()` 方法的帮助下动态设置了配置值,并且它完美地工作。希望你有所有其他的选择来解决这个问题。我推荐这个方法。就是这样。我确信这将适用于 Laravel 中的动态配置。 (2认同)

ale*_*ino 7

如果你想实际编辑配置文件(config/packagename.php或者.env),那么你可以按照matthiku的回答.

但是,如果我是你,我想我宁愿根据运行时定义的某个值来配置这个第三方软件包,而不是修改任何文件(顺便说一下,这个文件在下一个请求之前不会生效,当时再次读取env值).

所以,在我看来,最干净的方法是:

  • 在配置数据中存储您想要的值:

    config(['packagename.view_id' => Auth::user()->id]);

  • 但是,您可能会注意到这可能不起作用:提供所需服务的服务提供商通常在处理请求之前注册,即在配置更改发生之前注册.因此,您仍然可以使用旧值config获取服务.

  • 那么,如何才能在需要时(而不是在设置新的配置值之后)调用服务提供程序?您可以将其设为延期提供商.按照"spatie laravel-analytics"的示例,替换为config/app.php以下行:

    Spatie\Analytics\AnalyticsServiceProvider::class

    这一个:

    App\Providers\AnalyticsDeferredServiceProvider::class

    最后创建App\Providers\AnalyticsDeferredServiceProvider类,用:

:

<?php
namespace App\Providers;

use Spatie\Analytics\Analytics;
use Spatie\Analytics\AnalyticsServiceProvider;

class AnalyticsDeferredServiceProvider extends AnalyticsServiceProvider
{
    protected $defer = true;

    public function provides()
    {
        return [Analytics::class];
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,在设置任何运行时配置值之后,您可以让提供程序在您要实例化服务时读取配置值.


Sha*_*ary 6

当您需要更改时,在控制器中使用它。

  <?php

    use Illuminate\Support\Facades\Config;

     //[...]

    $user_id =  Auth::user()->id; 

    Config::set('view_id', $user_id );
Run Code Online (Sandbox Code Playgroud)