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