我在我的项目中使用了一个包,它在config/packagename
我想在配置文件中动态更改此值,这是文件结构当前的外观;
<?php
return [
'view_id' => '118754561',
'cache_lifetime_in_minutes' => 60 * 24,
];
我想把它改成这样的东西 -
'view_id' => Auth::user()->id,
您可以在配置文件中执行此操作,还是必须存储某种变量以便稍后在控制器中更新。有没有办法将这些变量放在env文件中并从控制器访问这些新变量?
答案 0 :(得分:19)
这也是动态更新.env文件的通用解决方案(各个键/值对)
return [ 'view_id' => env('VIEW_ID', '118754561'), etc... ]
将初始值添加到.env:
VIEW_ID = 118754561
在适当的控制器(例如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)
)
);
}
}
(如果你想使这个函数更通用,以便在.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');
其中filename
是config 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
希望这能帮到你!