Laravel adalah kerangka kerja aplikasi web PHP populer yang banyak digunakan untuk membangun aplikasi web berskala kecil, sedang hingga besar. Namun, ketika waktunya tiba untuk membangun aplikasi multi-tenant, dengan Laravel akan sedikit menantang. Di sinilah package Laravel for Tenancy berperan. Pada artikel ini, kami akan memperkenalkan Anda pada Tenancy for Laravel, apa itu, dan mengapa Anda harus menggunakannya.
Apa itu Tenancy for Laravel?
Tenancy for Laravel adalah paket yang memungkinkan Anda membuat aplikasi Laravel multi-penyewa. Dengan Tenancy, Anda dapat membuat satu aplikasi Laravel yang dapat melayani beberapa penyewa, masing-masing dengan skema database, data, dan konfigurasinya sendiri. Tenancy mencapai ini dengan mencegat permintaan HTTP yang masuk dan secara dinamis mengalihkan koneksi database dan konfigurasi lain berdasarkan penyewa.
Cara kerja tenancy adalah mencegat permintaan HTTP yang masuk dan secara dinamis mengalihkan permintaan kepada koneksi database dan konfigurasi berdasarkan tenant yang dituju.
Contohnya, Anda ingin memiliki website multi-tenancy berupa LMS beralamat di aptreelms.com. Ketika anda mengunjungi pram.aptreelms.com, maka anda sedang menggunakan Aptree LMS yang dimiliki oleh Pram, dimana aplikasi tersebut memiliki database dan konfigurasinya tersendiri, begitu juga tenant lainnya seperti fachtur.aptreelms.com.
Mengapa Menggunakan Tenancy for Laravel?
Mempermudah Pengembangan
Dengan Tenancy, Anda dapat membuat basis kode tunggal untuk aplikasi Laravel multi-penyewa Anda. Ini berarti Anda dapat menggunakan kembali kode yang sama untuk semua penyewa, dan hanya konfigurasi dan data yang akan berbeda. Ini membuat proses pengembangan lebih sederhana dan lebih efisien.
Reduced Costs
Membuat aplikasi Laravel terpisah untuk setiap tenant atau klien bisa lumayan mahal dan memakan waktu. Dengan Tenancy, Anda dapat mengurangi biaya dan waktu yang dihabiskan untuk pengembangan dengan membuat basis kode tunggal dan menggunakan kembali kode yang sama untuk semua tenant.
Kontrol Lebih Mudah
Tenancy memungkinkan Anda untuk mengelola semua tenant Anda dari satu dasbor. Anda dapat dengan mudah membuat, memperbarui, dan menghapus penyewa, serta mengelola konfigurasi dan data mereka.
Tentunya fitur dashbor ini harus anda buat terlebih dahulu sesuai dengan keperluan, namun tentunya, hal ini lebih mudah dibandingkan satu dashbor untuk satu tenant.
Peningkatan Efisiensi
Multi-tenancy dapat meningkatkan efisiensi dengan mengurangi upaya pengembangan dan pemeliharaan, dan dengan menyediakan instans aplikasi tunggal untuk beberapa penyewa. Ini mengurangi duplikasi upaya, yang mengarah pada pengembangan yang lebih cepat dan mengurangi waktu ke pasar.
Contoh Penggunaan Tenancy for Laravel
Untuk menggunakan Tenancy for Laravel pada proyek Anda, pertama-tama install package ini menggunakan Composer dengan menjalankan perintah berikut:
composer require tenancy/tenancy
Maka jalankan perintah tenancy:install
:
php artisan tenancy:install
Kemudian perintah di atas akan membuatkan beberapa file, yakni file migrasi, file konfigurasi, file routing, dan file service provider.
Kemudian jalankan perintah berikut untuk memigrasi database.
php artisan migrate
Daftarkan service provider Tenancy for Laravel pada config/app.php
. Dan pastikan posisinya sama seperti contoh kode di atas.
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\TenancyServiceProvider::class, // <-- here
Buat sebuah model Laravel untuk Tenant
<?php
namespace App\Models;
use Stancl\Tenancy\Database\Models\Tenant as BaseTenant;
use Stancl\Tenancy\Contracts\TenantWithDatabase;
use Stancl\Tenancy\Database\Concerns\HasDatabase;
use Stancl\Tenancy\Database\Concerns\HasDomains;
class Tenant extends BaseTenant implements TenantWithDatabase
{
use HasDatabase, HasDomains;
}
Pisahkan routing antara website sentral dan website tenant dengan membuat perubahan pada file berikut app/Providers/RouteServiceProvider.php
. Terlebih, kita akan membuat rute-rute pada website central hanya tersedia untuk domain sentral atau domain utama.
protected function mapWebRoutes()
{
foreach ($this->centralDomains() as $domain) {
Route::middleware('web')
->domain($domain)
->namespace($this->namespace)
->group(base_path('routes/web.php'));
}
}
protected function mapApiRoutes()
{
foreach ($this->centralDomains() as $domain) {
Route::prefix('api')
->domain($domain)
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
}
}
protected function centralDomains(): array
{
return config('tenancy.central_domains');
}
Letakkan method-method berikut pada method booth()
, gantikan $this->routes()
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
$this->mapApiRoutes();
$this->mapWebRoutes();
});
}
Atur domain sentral. Domain sentral adalah domain utama yang digunakan untuk website sentral (website utama). Buka config/tenancy.php
dan tambahkan kode-kode berikut:
'central_domains' => [
'saas.test', // Add the ones that you use. I use this one with Laravel Valet.
],
Pada file route tenant.php
, harusnya seperti ini:
Route::middleware([
'web',
InitializeTenancyByDomain::class,
PreventAccessFromCentralDomains::class,
])->group(function () {
Route::get('/', function () {
return 'This is your multi-tenant application. The id of the current tenant is ' . tenant('id');
});
});
Route-route tersebut hanya akan dapat diakses pada website tenant (domain selain sentral) — middleware PreventAccessFromCentralDomains
merupakan layer yang menerapkan kemampuan ini.
Sekarang Anda dapat menguji apakah website tenant dapat diakses dengan mengunjungi website tenant Anda. Tambahkan kode berikut ini pada tenant.php
anda sebagai contoh uji-coba.
Route::get('/', function () {
dd(\App\Models\User::all());
return 'This is your multi-tenant application. The id of the current tenant is ' . tenant('id');
});
Kesimpulan
Secara keseluruhan, multi-tenancy dapat memberikan manfaat yang signifikan dibandingkan single-tenancy, terutama untuk aplikasi perangkat lunak yang perlu melayani banyak pelanggan dengan berbagai kebutuhan dan persyaratan. Namun, penting untuk mengevaluasi dengan cermat kebutuhan aplikasi Anda dan kebutuhan pelanggan Anda sebelum memutuskan mengadopsi arsitektur multi-tenancy.
Meskipun multi-tenancy dapat memberikan manfaat yang disebutkan, pendekatan ini juga dapat secara signifikan meningkatkan kompleksitas DevOps.
Lebih lengkapnya terkait Tenancy for Laravel: https://tenancyforlaravel.com/