当前位置: 首页 > 知识库问答 >
问题:

Laravel 5.2:更新。带有用户输入的环境文件

毕魁
2023-03-14

我正在创建一个应用程序,并计划为用户提供一键式安装功能。其思想是在应用程序首次启动时显示一个表单,类似于安装/配置屏幕,用户将在其中键入数据库详细信息(主机名、数据库名、用户名)

  1. 更新包含主机名、db名、用户名的. env文件

可以通过代码执行吗?我试着用谷歌搜索这个,但找不到任何帮助。

正如标题所说,我正在使用L5。2.本项目。

共有2个答案

狄雅珺
2023-03-14

一切都可以使用代码来完成;)

您可以编写一个sh脚本,从代码中调用,也可以直接从代码中执行此操作。

  1. 我没有看到任何用于复制和填充的函数。env文件,但您可以读取。环境。示例使用文件\u获取内容()并在将新文件写回磁盘之前更新内容
上官斌
2023-03-14

因此,这是最终的解决方案后,玩这个。

我的控制器:

use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Storage;

class TestController extends Controller
{
    public function index() {

        // Values I want to insert 
        $data = [
            'APP_KEY'       => str_random(32),
            'DB_HOST'       => 'localhost',
            'DB_DATABASE'   => 'lara_test',
            'DB_USERNAME'   => 'root',
            'DB_PASSWORD'   => ''
        ];

        // default values of .env.example that I want to change
        $defaults = ['SomeRandomString', '127.0.0.1', 'homestead', 'homestead', 'secret'];

        // get contents of .env.example file
        $content = file_get_contents(base_path() . '/.env.example');

        // replace default values with new ones
        $i = 0;
        foreach ($data as $key => $value) {

            $content = str_replace($key.'='.$defaults[$i], $key.'='.$value, $content);
            $i++;
        }

        // Create new .env file
        Storage::disk('root')->put('.env', $content);

        // run all migrations
        Artisan::call('migrate');

        // run all db seeds
        Artisan::call('db:seed');

        dd('done');

    }

}

新磁盘驱动程序:

为了在项目根目录下创建一个新文件,我必须创建一个新的磁盘驱动程序。我在我的config/app中添加了以下代码。php文件:

'disks' => [

    .....

    'root' => [
        'driver' => 'local',
        'root'   => base_path(),
    ],

],

这使我能够通过使用:

Storage::disk('root')->put('filename', $content);

总结:

所以基本上我得到的内容。环境。示例文件,更改所需常量的值,然后创建新的。环境文件。在那之后,我进行了所有的迁徙和播种。

注意:我不得不手动设置APP\u密钥,因为出现了一个愚蠢的错误,没有找到支持的加密程序。密码和/或密钥长度无效。

因为我试图在代码中做所有事情,而不是通过命令-我尝试使用Artisan::call('key:生成');,但由于一些奇怪的原因,它不起作用,所以要解决这个问题,我不得不手动创建一个随机字符串它是32位长,并设置为APP_KEY

希望这对其他人有帮助。:)感谢@rypskar的帮助。

 类似资料:
  • 问题内容: 如何用另一个.yml文件更新先前的conda环境。在具有多个需求文件(例如)的项目上工作时,这非常有用。 例如,下面是一个包含和pip软件包的文件: 碱基 实际环境是使用创建的 。 稍后,需要将其他软件包添加到中。例如,另一个文件需要导入这些更新。 先前完成此任务的尝试包括: 创建具有导入定义的文件: 然后运行命令: 。 这是行不通的。有什么想法吗? 问题答案: 尝试使用 或无需激活环

  • 这是情况:我是第一次在Yii2上,想在ActiveForm中使用一些文件上传器小部件...到目前为止,我已经找到了这个出色的:\kartik\widget\FileInput 有了这个小部件,我可以管理文件上传,然后,当进入编辑模式时,显示以前上传的图像和替换它的机会。 问题是,如果我按下表单的“更新”按钮而不修改图像,yii说图像“不能是空的”,因为我在模型中设置了“必需”规则。

  • 问题内容: 我目前正在使用python / curses编写应用程序用户界面,我想知道是否可以要求用户在用户界面不断更新时按下键(cbreak模式)以隐藏或显示某些面板或窗口。 我阅读了有关curses的官方python文档并进行了一些尝试,但是即使使用cbreak模式和非阻塞输入模式(nodelay)已激活,我也无法使其正常工作(我成功获取了用户输入,但是在阻止UI的代价不是我想要的)。 所以我

  • 我正在设置一个,它在用户输入整数之前一直执行。但是,按照我现在的方式,循环在输入整数后再次打印消息,然后程序正常执行。有人能建议一种方法来使输入整数后不再打印该消息吗?谢了!

  • 问题内容: 这里的Python新手非常抱歉,我确定这是一个愚蠢的问题,但是我似乎无法在要求我使用while循环检查有效用户输入的教程中解决以下挑战。 (使用Python2.7) 这是我的代码,但无法正常工作: 上面打印输出到控制台: 这显然是不正确的-循环应该在用户输入“ y”或“ n”时结束,但是我不确定如何执行此操作。我在这里做错了什么? 注意:挑战要求我同时使用运算符和 问题答案: 较短的解

  • 预期的行为是容器执行: 我做错了什么?