5.7 在 Heroku 上使用 PostgreSQL - 第五章、用户注册
5.7 在 Heroku 上使用 PostgreSQL
5.7 在 Heroku 上使用 PostgreSQL
Heroku 为 Laravel 应用提供了数据存储的功能,我们可以在 Heroku 上使用 MySQL 或 PostgreSQL 来进行数据存储。由于 Heroku 对 PostgreSQL 的支持比 MySQL 更好,因此本教程中将在 Heroku 上使用 PostgreSQL 来作为我们应用的数据库。
要在 Heroku 上使用 PostgreSQL,我们需要先安装 PostgreSQL 扩展。
$ heroku addons:add heroku-postgresql:hobby-dev
安装完成之后,Heroku 将为我们生成一个唯一的数据库 URL - DATABASE_URL,我们可以通过下面命令查看 Heroku 的所有配置信息:
$ heroku config
在本地开发中,我们使用了 MySQL 来作为数据库储存,但在 Heroku 环境上我们要改为使用 PostgreSQL 来作为数据库储存。因此在进行数据库设置时,我们需要对当前环境进行判断。如果环境为本地环境,则使用 MySQL 数据库,若为 Heroku 环境,则使用 PostgreSQL 数据库。我们可以通过为 Heroku 新增一个 IS_IN_HEROKU 配置项来判断应用是否运行在 Heroku 上。
$ heroku config:set IS_IN_HEROKU=true
一般来说,应用的数据库都在 config/database.php 中进行配置,因此我们需要针对该配置文件,来为不同环境的数据库连接方式定义一个帮助方法,以便根据应用不同的运行环境来指定数据库配置信息,我们需要新建一个 helpers.php 文件并写入以下内容:
bootstrap/helpers.php
function get_db_config()
{
if (getenv('IS_IN_HEROKU')) {
$url = parse_url(getenv("DATABASE_URL"));
return $db_config = [
'connetion' => 'pgsql',
'host' => $url["host"],
'database' => substr($url["path"], 1),
'username' => $url["user"],
'password' => $url["pass"],
];
} else {
return $db_config = [
'connetion' => env('DB_CONNECTION', 'mysql'),
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
];
}
}
可以看到,我们定义了 get_db_config 方法来根据数据库的不同运行环境获取不同的配置信息。通过 Heroku 生成的 DATABASE_URL 包含了一切与数据库相关的配置信息,如主机、用户名、密码、数据库等,因此我们需要使用 parse_url 方法对其进行解析,来获取到指定的值。当运行环境为 Heroku 时,我们使用 DATABASE_URL 提供的数据库配置信息,如果为其它环境,则使用默认的数据库配置信息。
在我们新增 helpers.php 文件之后,还需要在应用中对该文件进行配置,自动加载该文件。
bootstrap/autoload.php
.
.
.
require __DIR__.'/helpers.php';
现在,让我们使用刚刚定义好的 get_db_config 方法对数据库进行配置。
config/database.php
$db_config = get_db_config();
return [
'fetch' => PDO::FETCH_CLASS,
'default' => $db_config['connetion'],
'connections' => [
'sqlite' => [
'driver' => 'sqlite',
'database' => database_path('database.sqlite'),
'prefix' => '',
],
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
'pgsql' => [
'driver' => 'pgsql',
'host' => $db_config['host'],
'database' => $db_config['database'],
'username' => $db_config['username'],
'password' => $db_config['password'],
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
],
],
'migrations' => 'migrations',
'redis' => [
'cluster' => false,
'default' => [
'host' => env('REDIS_HOST', 'localhost'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
],
];
现在整个用户注册功能到此已开发完毕。让我们将改动的代码进行提交,并推送到 GitHub 和 Heroku 上。
$ git add -A
$ git commit -m "Updated database configuration"
$ git push
$ git push heroku master
我们可以使用 heroku run 在 Heroku 运行 Laravel 的指定命令。现在我们需要在 Heroku 上执行迁移,生成用户表,可通过下面命令来完成:
$ heroku run php artisan migrate
若提示是否要在生产环境上运行此命令,请输入 yes。
如果你要在 Heroku 上重置 PostgreSQL 数据库,可以使用以下命令:
$ heroku pg:reset DATABASE
$ heroku run php artisan migrate