Laravel 5.2:使用用户输入和 运行 通过代码迁移更新 .env 文件
Laravel 5.2: Update .env file with user input & run migrations through code
我正在创建一个应用程序,我打算为用户提供一键安装功能。这个想法是在应用程序首次启动时显示一个表单,类似于安装/配置屏幕,用户将在其中键入数据库详细信息(主机名、数据库名称、用户名和密码),并将输入用户详细信息(默认管理员的电子邮件、用户名和密码)帐户)。他提交表格后,我想执行以下任务:
- 使用主机名、数据库名称、用户名和密码更新 .env 文件
- 运行 所有迁移
- 运行全部db:seeds
- 根据用户输入创建用户(这不是什么大问题)
可以通过代码实现吗?我已经尝试 google 这个但找不到任何帮助。
正如标题所说,我在这个项目中使用 L5.2。
一切都可以使用代码完成;)
您可以编写一个从您的代码调用的 sh 脚本,或者您可以直接从您的代码执行此操作。
- 我没有看到任何用于复制和填充 .env 文件的函数,但您可以使用
file_get_contents()
读取 .env.example 并在将新文件写回磁盘之前更新内容。
\Illuminate\Support\Facades\Artisan::call('migrate');
\Illuminate\Support\Facades\Artisan::call('db:seed');
(未测试,因为我只是在可以使用 $this->seed();
的测试中完成此操作
User::create(['column', => $value])
所以这是玩弄这个之后的最终解决方案。
我的控制器:
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');
但由于某些 st运行ge 原因它不起作用所以要解决这个问题,我必须手动创建一个 32 位长的 运行dom 字符串并将其设置为 APP_KEY
.
希望这对其他人有所帮助。 :)
感谢@rypskar 的帮助。
我正在创建一个应用程序,我打算为用户提供一键安装功能。这个想法是在应用程序首次启动时显示一个表单,类似于安装/配置屏幕,用户将在其中键入数据库详细信息(主机名、数据库名称、用户名和密码),并将输入用户详细信息(默认管理员的电子邮件、用户名和密码)帐户)。他提交表格后,我想执行以下任务:
- 使用主机名、数据库名称、用户名和密码更新 .env 文件
- 运行 所有迁移
- 运行全部db:seeds
- 根据用户输入创建用户(这不是什么大问题)
可以通过代码实现吗?我已经尝试 google 这个但找不到任何帮助。
正如标题所说,我在这个项目中使用 L5.2。
一切都可以使用代码完成;)
您可以编写一个从您的代码调用的 sh 脚本,或者您可以直接从您的代码执行此操作。
- 我没有看到任何用于复制和填充 .env 文件的函数,但您可以使用
file_get_contents()
读取 .env.example 并在将新文件写回磁盘之前更新内容。 \Illuminate\Support\Facades\Artisan::call('migrate');
\Illuminate\Support\Facades\Artisan::call('db:seed');
(未测试,因为我只是在可以使用$this->seed();
的测试中完成此操作
User::create(['column', => $value])
所以这是玩弄这个之后的最终解决方案。
我的控制器:
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');
但由于某些 st运行ge 原因它不起作用所以要解决这个问题,我必须手动创建一个 32 位长的 运行dom 字符串并将其设置为 APP_KEY
.
希望这对其他人有所帮助。 :) 感谢@rypskar 的帮助。