Konfigurasi Multi Pangkalan Data (Database) di Laravel

Yugo
Laravel Indonesia
Published in
2 min readApr 30, 2017

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 Name
|--------------------------------------------------------------------------
|
| This value is the name of your application. This value is used when the
| framework needs to place the application's name in a notification or
| any other location as required by the application or its packages.
*/
'name' => env('APP_NAME', 'Laravel'),

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', '127.0.0.1'),
'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,
],

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. 😉

Originally published at www.laravel.web.id on April 30, 2017.

--

--