public function saveDatabaseSettings() { $details = Request::all(); $v = Validator::make($details, ['user' => 'required', 'name' => 'required']); if (!$v->passes()) { FormMessage::set($v->messages()); return $this->setupDatabase(); } $hostPort = explode(':', $details['host']); if (count($hostPort) === 2 && (int) $hostPort[1]) { list($details['host'], $port) = $hostPort; } try { $host = ($details['host'] ?: 'localhost') . (isset($port) ? ';port=' . $port : ''); new \PDO('mysql:dbname=' . $details['name'] . ';host=' . $host, $details['user'], $details['password']); } catch (\PDOException $e) { switch ($e->getCode()) { case 1045: FormMessage::add('user', $e->getMessage()); break; case 1049: FormMessage::add('name', $e->getMessage()); break; case 2003: case 2005: FormMessage::add('host', $e->getMessage()); break; default: FormMessage::add('host', $e->getMessage()); } return $this->setupDatabase(); } $updateEnv = ['DB_HOST' => $details['host'], 'DB_DATABASE' => $details['name'], 'DB_PREFIX' => !empty($details['prefix']) ? $details['prefix'] : '', 'DB_USERNAME' => $details['user'], 'DB_PASSWORD' => $details['password']]; if (isset($port)) { $updateEnv['DB_PORT'] = $port; } try { $envFileContents = File::getEnvContents(); $dotEnv = new Dotenv(base_path(), File::getEnvFile()); foreach ($dotEnv->load() as $env) { $envParts = explode('=', $env); if (key_exists($envParts[0], $updateEnv)) { $envFileContents = str_replace($env, $envParts[0] . '=' . $updateEnv[$envParts[0]], $envFileContents); } } file_put_contents(base_path('.env'), $envFileContents); Artisan::call('key:generate'); } catch (\Exception $e) { FormMessage::add('host', 'can\'t write settings to the .env file, check it is writable for the installation'); return $this->setupDatabase(); } Install::setInstallState('coaster.install.databaseMigrate'); return \redirect()->route('coaster.install.databaseMigrate'); }