Konfigurasi Multi Pangkalan Data (Database) di Laravel


Di Laravel, kita akan menemui dua buah jenis konfigurasi. Yaitu, PHPDotEnv yang disimpan dalam berkas .env, dan lainnya adalah berbasis .php yang tersimpan dalam direktori config.

Konfigurasi .env pada umumnya tidak digunakan langsung oleh aplikasi yang kita buat, tapi digunakan oleh konfigurasi bawaan Laravel. Seperti contoh potongan skrip di bawah misalnya:

/*
|--------------------------------------------------------------------------
| Application Environment
|--------------------------------------------------------------------------
|
| This value determines the "environment" your application is currently
| running in. This may determine how you prefer to configure various
| services your application utilizes. Set this in your ".env" file.
|
 */

'env'             => env('APP_ENV', 'production'),

Yang mana, fungsi env() berfungsi untuk mengambil konfigurasi dengan kunci APP_ENV pada berkas .env. Parameter kedua dari fungsi tersebut berguna untuk menentukan default value.

Tentunya, fungsi env() tidak hanya dapat digunakan pada berkas konfigurasi Laravel, tapi dapat digunakan juga pada seluruh bagian aplikasi (controller, model, views, common class, facade, dst).

Lantas, kenapa sebagain konfigurasi disimpan pada berkas terpisah?

You should never store sensitive credentials in your code.

Secara spesifik, data yang disimpan pada konfigurasi .env adalah yang bersifat credential. Seperti konfigurasi pangkalan data (database) atau SMTP email misalnya. Nantinya, berkas .env ini harus diabaikan dalam CVS agar tidak ikut didistribusikan dalam aplikasi.

Jadi, Bagaimana Konfigurasinya?

Nah, konfigurasi multi database di Laravel itu sebenarnya sederhana. Kita cukup memodifikasi berkas config/database.php, dan menambahkan koneksi baru di dalamnya.

Sebagai contoh, kita menggunakan driver yang sama, yaitu MySQL.

'mysql'  => [
    'driver'      => 'mysql',
    'host'        => env('DB_HOST', 'localhost'),
    'port'        => env('DB_PORT', '3306'),
    'database'    => env('DB_DATABASE', 'forge'),
    'username'    => env('DB_USERNAME', 'forge'),
    'password'    => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset'     => 'utf8mb4',
    'collation'   => 'utf8mb4_unicode_ci',
    'prefix'      => '',
    'strict'      => true,
    'engine'      => null,
],

'secondary'  => [
    'driver'      => 'mysql',
    'host'        => 'localhost',
    'port'        => '',
    'database'    => 'secondary_db',
    'username'    => 'secondary_db',
    'password'    => 'secretPassword',
    'unix_socket' => '',
    'charset'     => 'utf8mb4',
    'collation'   => 'utf8mb4_unicode_ci',
    'prefix'      => '',
    'strict'      => true,
    'engine'      => null,
],

Dengan asumsi konfigurasinya berbeda, maka penulisannya dapat dibuat seperti skrip di atas.

Sampai di sini, kedua koneksi tersebut dapat digunakan pada model sesuai dengan keperluan aplikasi. Untuk implementasi, cukup menambahkan properti $connection pada model.

protected $connection = 'secondary';

Permasalan muncul ketika aplikasi akan didistribusikan pada khalayak. Apabila menggunakan CVS maka credential yang tersimpan dalam berkas config/database.php dapat dibaca oleh semua orang. Jika dikosongkan, maka pemrogram harus mengaturnya setiap kali ada perubahan, dan akan bermasalah ketika di-push ke server repositori.

Cara terbaiknya adalah dengan menyimpan informasi pangkalan data sekunder tersebut pada berkas .env.

DB_SECONDARY_CONNECTION=mysql
DB_SECONDARY_HOST=127.0.0.1
DB_SECONDARY_PORT=3306
DB_SECONDARY_DATABASE=secondary_db
DB_SECONDARY_USERNAME=secondary_db
DB_SECONDARY_PASSWORD=secretPassword

Kemudian, konfigurasi yang ada di berkas config/database.php diubah agar nilanya mengambil dari berkas .env.

'secondary'  => [
    'driver'      => 'mysql',
    'host'        => env('DB_SECONDARY_HOST', 'localhost'),
    'port'        => env('DB_SECONDARY_PORT', '3306'),
    'database'    => env('DB_SECONDARY_DATABASE', 'forge'),
    'username'    => env('DB_SECONDARY_USERNAME', 'forge'),
    'password'    => env('DB_SECONDARY_PASSWORD', ''),
    'unix_socket' => env('DB_SECONDARY_SOCKET', ''),
    'charset'     => 'utf8mb4',
    'collation'   => 'utf8mb4_unicode_ci',
    'prefix'      => '',
    'strict'      => true,
    'engine'      => null,
],

That’s it! Kini aplikasi dapat didistribusikan dengan aman dan mudah. 😉

Tak Berkategori

Yugo Purwanto

Pemrogram PHP dan JavaScript yang sedang sibuk mengembangkan aplikasi Glosarium Bahasa Indonesia.

Tinggalkan Balasan