Laravel动态配置设置

时间:2016-09-18 21:54:35

标签: php laravel laravel-5 laravel-5.2

我在我的项目中使用了一个包,它在config/packagename

中存储了一个设置

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

<?php

return [
    'view_id' => '118754561',

    'cache_lifetime_in_minutes' => 60 * 24,
];

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

'view_id' => Auth::user()->id,

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

8 个答案:

答案 0 :(得分:19)

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

  1. 更改config / packagename中的设置,如下所示:
  2. return [
        'view_id' => env('VIEW_ID', '118754561'),
        etc...
    ]
    
    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)
                  )
              );
          }
      }
      
    3. (如果你想使这个函数更通用,以便在.env中使用key = value对,需要使用$ delim参数,其中值必须用双引号括起来,因为它们包含空格)。

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

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

答案 1 :(得分:7)

如果您想实际编辑配置文件(config/packagename.php.env),则可以关注matthiku's answer

然而,如果我是你,我想我更愿意根据运行时定义的某些值来配置这个第三方软件包,而不是修改任何文件(顺便说一句,它不会生效直到下一个请求,再次读取env值时。)

因此,在我看来,最简洁的方法是:

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

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

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

  • 那么,如何才能在需要时(而不是在设置新的配置值之后)调用服务提供者?您可以将其设为 deferred 提供程序。按照&#34; spatie laravel-analytics&#34;的例子,在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];
    }
}

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

答案 2 :(得分:6)

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

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

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

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

app/config/custom.php中创建一个文件,其中包含配置键和值,如: -

return array(
  'my_val' => 'mysinglelue',
  'my_arr_val' => array('1', '2', '3'),
);

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

<强>语法:

echo Config::get('filename.arraykey');

其中filenameconfig file’s name,在我们的情况下是自定义,而key是您想要访问的值的array key

在我们的案例中,它将如下:

echo Config::get('custom.my_val');

在laravel中创建运行时配置: -

在运行时设置的配置值将为当前请求设置,不会转移到后续请求。

  

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

就像@Kundan roy所建议的isset()使用相同的条件一样适用于此。但是这个是替代方法,可用于动态设置配置中的值。

Config::set('custom.my_val', 'mysinglelue');

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

答案 3 :(得分:3)

你可以这样做。

在自定义配置文件中。添加以下代码您可以从查询字符串动态发送您的ID。

'view_id' => isset($_REQUEST['view_id'])?$_REQUEST['view_id']:null,

获取视图ID

 echo config('app.view_id'); // app is config file name

答案 4 :(得分:2)

需要更改时在控制器中使用此功能。

  <?php

    use Illuminate\Support\Facades\Config;

     //[...]

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

    Config::set('view_id', $user_id );

答案 5 :(得分:0)

自Laravel v5.2起,您可以动态设置配置值this way

<?php

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

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

echo $value;
// output: 'America/Chicago'

答案 6 :(得分:0)

  

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

答案 7 :(得分:-1)

实际上,如果你的代码点迫使你使配置值动态化,那么你的代码流应该有问题,因为使用配置文件只是为了初始化所需的值 - 应该在之前定义该应用已加载。

使配置值动态化是编码世界中的&#34; BAD PRACTICE&#34; 。 因此,您的问题有以下替代方案。

在.env文件中定义值(可选)

VIEW_ID=your_view_id_here

在控制器内使用值

$auth_id = auth()->user()->id;
$view_id = env('VIEW_ID', $auth_id);
// If .env file doesn't contains 'VIEW_ID' it will take $auth_user as the view_id

希望这能帮到你!