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文件的通用解决方案(各自的键/值对)
Run Code Online (Sandbox Code Playgroud)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)
)
);
}
}
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)
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)
这里filename是config 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/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)
这样,在设置任何运行时配置值之后,您可以让提供程序在您要实例化服务时读取配置值.
当您需要更改时,在控制器中使用它。
<?php
use Illuminate\Support\Facades\Config;
//[...]
$user_id = Auth::user()->id;
Config::set('view_id', $user_id );
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26404 次 |
| 最近记录: |