0

Я создаю приложение, и я планирую предоставить пользователям возможность установки одним кликом. Идея состоит в том, чтобы показать форму при первом запуске приложения, в виде экрана установки/конфигурации, где пользователь будет вводить данные базы данных (имя хоста, имя db, имя пользователя &) и вводит данные пользователя (адрес электронной почты, имя пользователя и пароль для администратора по умолчанию Счет). После того, как он представит форму, я хочу сделать следующие задачи:Laravel 5.2: обновить файл .env с пользовательскими вводами и выполнить миграцию через код

  1. Update .env файл с именем хоста, имя БД, имя пользователя & пароль
  2. Выполнить все миграции
  3. Выполнить все дб: семена
  4. Создайте пользователя на основе ввода пользователем (это не очень важно)

Можно ли это сделать через код? Я попытался сделать это, но не могу найти никакой помощи.

Как говорится в названии, я использую L5.2 для этого проекта.

ответ

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

    } 

} 

Новый Диск Driver:

Чтобы создать новый файл в корневом каталоге проекта, я должен был создать новый диск с драйверами. Я добавил следующий код в моем config/app.php файле:

'disks' => [ 

    ..... 

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

], 

и это позволило мне создать новый файл в корневом каталоге с помощью:

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

Резюме:

Поэтому в основном я набираюсь содержимое .env.example файл, изменяя значения констант, которые я хочу, а затем создаю новый файл .env. После этого я провел все мои миграции и семена.

Примечание: мне пришлось вручную установить APP_KEY из-за глупой ошибки No supported encrypter found. The cipher and/or key length are invalid.

Поскольку я пытаюсь сделать все, что внутри кода, а не через команды - я попытался с помощью Artisan::call('key:generate'); но каким-то странным причинам не работал, поэтому, чтобы исправить проблему, мне пришлось создать случайную строку вручную, длина которой 32 бит, и установить ее как APP_KEY.

Надеюсь, это поможет кому-то еще. :) И спасибо @rypskar за помощь.

1

Все может быть сделано с помощью кода;)

Вы могли бы написать сценарий ш которого вы звоните из вашего кода или вы можете сделать это прямо из вашего кода.

  1. Я не видел каких-либо функций для копирования и заполнения .env файл, но вы можете прочитать .env.example с помощью file_get_contents() и обновить содержимое перед записью нового файла на диск.
  2. \Illuminate\Support\Facades\Artisan::call('migrate');
  3. \Illuminate\Support\Facades\Artisan::call('db:seed'); (Не тестировался, так как я только сделал это из теста, где можно использовать $this->seed();
  4. User::create(['column', => $value])
+0

Спасибо за помощь помощник. – Jazzbot