0

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

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

是否可以通过代码进行?我试图用谷歌搜索,但找不到任何帮助。

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

4

2 回答 2

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])
于 2016-06-20T11:25:10.297 回答
2

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

我的控制器:

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文件。之后,我运行了所有的迁移和种子。

注意:APP_KEY由于一个愚蠢的错误没有找到支持的加密器, 我不得不手动设置。密码和/或密钥长度无效。

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

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

于 2016-06-21T10:00:17.563 回答