From cc74d4020db8894f65bc33e93525d31e524ecc46 Mon Sep 17 00:00:00 2001 From: printempw Date: Sun, 28 Aug 2016 18:33:47 +0800 Subject: [PATCH] add installation check at BootServiceProvider --- app/Providers/BootServiceProvider.php | 79 +++++++++++++++++++++++++++ app/Services/Database/Database.php | 22 +++++--- app/Services/Database/Migration.php | 28 ++++++++++ app/Services/Http.php | 8 ++- 4 files changed, 128 insertions(+), 9 deletions(-) create mode 100644 app/Providers/BootServiceProvider.php create mode 100644 app/Services/Database/Migration.php diff --git a/app/Providers/BootServiceProvider.php b/app/Providers/BootServiceProvider.php new file mode 100644 index 00000000..300d14ba --- /dev/null +++ b/app/Providers/BootServiceProvider.php @@ -0,0 +1,79 @@ +checkDbConfig(); + $this->checkInstallation(); + } + + protected function checkDbConfig() + { + // use error control to hide shitty connect warnings + @$conn = new \mysqli( + config('database.connections.mysql.host'), + config('database.connections.mysql.username'), + config('database.connections.mysql.password'), + config('database.connections.mysql.database'), + config('database.connections.mysql.port') + ); + + if ($conn->connect_error) + throw new E("无法连接至 MySQL 服务器,请检查你的配置:".$conn->connect_error, $conn->connect_errno, true); + + return true; + } + + protected function checkInstallation() + { + if (!$this->checkTableExist()) { + \Http::redirect(url('/setup/index.php')); + } + + if (!is_dir(BASE_DIR.'/textures/')) { + throw new E("检测到 `textures` 文件夹已被删除,请重新运行 安装程序,或者手动放置一个。", -1, true); + } + + if (config('app.version') != \Option::get('version', '')) { + \Http::redirect(url('/setup/update.php')); + } + + return true; + } + + public static function checkTableExist() + { + $tables = ['users', 'closets', 'players', 'textures', 'options']; + + foreach ($tables as $table_name) { + // prefix will be added automatically + if (!\Schema::hasTable($table_name)) { + return false; + } + } + + return true; + } + + /** + * Register any application services. + * + * @return void + */ + public function register() + { + // + } +} diff --git a/app/Services/Database/Database.php b/app/Services/Database/Database.php index ccb0b1d2..fd1d1ca2 100644 --- a/app/Services/Database/Database.php +++ b/app/Services/Database/Database.php @@ -41,12 +41,19 @@ class Database */ public function __construct($config = null) { + if (is_null($config)) { + $db_config = require BASE_DIR.'/config/database.php'; + $config = $db_config['connections']['mysql']; + } + + $this->config = $config; + @$this->connection = new \mysqli( - config('database.connections.mysql.host'), - config('database.connections.mysql.username'), - config('database.connections.mysql.password'), - config('database.connections.mysql.database'), - config('database.connections.mysql.port') + $this->config['host'], + $this->config['username'], + $this->config['password'], + $this->config['database'], + $this->config['port'] ); if ($this->connection->connect_error) @@ -138,7 +145,7 @@ class Database public function hasTable($table_name) { - $sql = "SELECT table_name FROM `INFORMATION_SCHEMA`.`TABLES` WHERE (table_name = '$table_name') AND TABLE_SCHEMA='".Config::getDbConfig()['database']."'"; + $sql = "SELECT table_name FROM `INFORMATION_SCHEMA`.`TABLES` WHERE (table_name = '$table_name') AND TABLE_SCHEMA='".$this->config['database']."'"; return ($this->query($sql)->num_rows != 0) ? true : false; } @@ -191,8 +198,9 @@ class Database public function __destruct() { - if (!is_null($this->connection)) + if (!is_null($this->connection)) { $this->connection->close(); + } } } diff --git a/app/Services/Database/Migration.php b/app/Services/Database/Migration.php new file mode 100644 index 00000000..c02ea51c --- /dev/null +++ b/app/Services/Database/Migration.php @@ -0,0 +1,28 @@ +bound('session')) { + Session::flash('msg', $msg); + Session::save(); + } else { + $_SESSION['msg'] = $msg; + } } if (!headers_sent()) {