【问题标题】:Laravel 5.2: Update .env file with user input & run migrations through codeLaravel 5.2:使用用户输入更新 .env 文件并通过代码运行迁移
【发布时间】:2016-10-21 14:04:12
【问题描述】:

我正在创建一个应用程序,并计划为用户提供一键式安装功能。这个想法是在应用程序首次启动时显示一个表单,类似于安装/配置屏幕,用户将在其中输入数据库详细信息(主机名、数据库名称、用户名和密码)并输入用户详细信息(默认管理员的电子邮件、用户名和密码)帐户)。一旦他提交表单,我想做以下任务:

  1. 使用主机名、数据库名称、用户名和密码更新 .env 文件
  2. 运行所有迁移
  3. 运行所有 db:seeds
  4. 根据用户输入创建用户(这不是什么大问题)

可以通过代码实现吗?我试图用谷歌搜索,但找不到任何帮助。

正如标题所说,我在这个项目中使用的是 L5.2。

【问题讨论】:

    标签: php laravel laravel-5.2 laravel-migrations laravel-seeding


    【解决方案1】:

    所以这是玩弄这个之后的最终解决方案。

    我的控制器:

    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);
    

    总结:

    所以基本上我正在获取 .env.example 文件的内容,更改我想要的常量的值,然后创建一个新的 .env 文件。之后,我运行了所有的迁移和种子。

    注意: 由于愚蠢的错误No supported encrypter found. The cipher and / or key length are invalid.,我不得不手动设置APP_KEY

    由于我试图在代码中执行所有操作,而不是通过命令 - 我尝试使用 Artisan::call('key:generate'); 但由于一些奇怪的原因它无法解决问题,我不得不手动创建一个随机字符串,即 32有点长,设置为APP_KEY

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

    【讨论】:

      【解决方案2】:

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

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

      1. 我没有看到任何用于复制和填充 .env 文件的函数,但您可以使用 file_get_contents() 读取 .env.example 并在将新文件写回磁盘之前更新内容。
      2. \Illuminate\Support\Facades\Artisan::call('migrate');
      3. \Illuminate\Support\Facades\Artisan::call('db:seed');(未测试,因为我只是在可以使用$this->seed();的测试中完成此操作
      4. User::create(['column', => $value])

      【讨论】:

      • 感谢朋友的帮助。
      猜你喜欢
      • 2017-01-24
      • 2016-12-25
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 2018-08-01
      • 2016-08-29
      • 2016-03-29
      • 1970-01-01
      相关资源
      最近更新 更多