繁体   English   中英

通过专用视图永久更新 laravel 配置文件

[英]Update laravel config file permanently through a dedicated view

我创建了一个 Laravel 应用程序,其视图是一个表单,其中包含一些由 laravel 配置文件“config.options”填充的输入字段。

我想通过这个特定的视图更新这个文件,我说的是配置文件夹中的标准 php 文件,而不是数据库内容。

为此,在我的 controller 中,我有一个这样的更新方法

LARAVEL PHP CONTROLLER

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    /*VarExporter is just a library to beautify parsed arrays instead of using var_export*/
    use Brick\VarExporter\VarExporter;
    
    class SettingsController extends Controller
    {
    
        
     public function update(Request $request){
            
            $values = $request->validate([
        
                "support_mail" => ['required', 'email:rfc,dns'],
                "api_endpoint" => ['required','URL']
        
            ]);
        
            $config = (object) config('options');
        
            $config->support_mail = $request->support_mail;
            $config->api_endpoint= $request->api_endpoint;
        
            $newConfig = VarExporter::export(
                             (array) $config,
                             VarExporter::INLINE_SCALAR_LIST | VarExporter::ADD_RETURN
                         );
        
        
            if( \File::put(base_path() . '/config/options.php', "<?php\n\n". $newConfig) ) {
                
                \Artisan::call('config:clear');
        
                return back()->with('message', 'Settings updated');
        
            }
        
        }

我在这里做的是:

  1. 将配置作为 object 调用到 $newConfig 变量中
  2. 将请求的值更新为 $newConfig
  3. 将新配置写入配置文件
  4. 清除配置缓存
  5. 返回成功消息。

这很简单,毫无疑问,问题是当我在成功提交后返回视图时,输入字段没有更新,但如果我等待 2 秒并刷新页面,配置看起来已更新。 所以我试着睡了 2 秒

sleep(2);
return back()->with('message', 'Settings updated');

在返回和更新字段之前,就像我刷新缓存时需要一些时间来更新配置,或者至少比刷新页面所花费的时间更长。

我真的尝试了一切,但我找不到出路,显然我知道我可以通过数据库做到这一点,但我想了解如何以这种方式做到这一点只是为了教育目的。 我假设我必须每秒做一次循环来检查配置缓存是否清除然后返回,但我无法理解配置缓存存储在哪里,因为框架/缓存/数据看起来是空的

更新

只是为了排除与配置缓存相关的内容,我尝试使用不相关的框架文件来做同样的事情,而不是配置助手,我使用了规范 PHP 语言和 file_put_contents 的要求。 结果完全一样..所以我在想php对文件系统的管理,我不认为laravel相关。

更新 2

好的......如果我登录

file_get_contents(base_path() . '/config/options.php')

代替

config('options')

提交后,数据将被更新..我认为与配置助手相关的东西也是如此

好的,我找到了,经过 100 万次检查试图了解它是否与 laravel 生态系统或服务器端相关,我发现它是 opcache,显然它是 opcache,因为对于 opcache 来说,一个包含数据的文件只是一个脚本,所以它是缓存,在我的例子中,更改后更新缓存大约需要 1.5 秒。 有时,当您使用框架时,您会忘记主要语言的基础知识。 您可以使用

opcache_reset();

提交数据后解决这个问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM