Primary Key: UUID String
Semua model menggunakan UUID string sebagai primary key, di-generate di boot():
protected $keyType = 'string';
public $incrementing = false;
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->id = (string) Str::uuid();
});
}Permission Gate Pattern
Setiap method di controller dimulai dengan permission check:
$user = auth()->guard('admin')->user();
$permission = findPermissionByName($user, '<permission name>');
if (!$permission || !$permission->read) {
return redirect()->route('accessdenied');
}Nama permission yang umum: list user, add user, list customer, add customer, list order, list payment, list device, list package, list withdraw, list coupon, list ticketing, list registration link, list covendor, list addon, list crm, list contact, list chat, list analytic, list transaction, list dashboard, list platform setting.
Duration Parsing
Package duration disimpan sebagai string "N Unit" dan di-parse dengan explode(' '):
$duration = explode(' ', $package->duration);
$d_value = (int) $duration[0]; // 1, 2, 3, ...
$d_satuan = $duration[1]; // "Month", "Year", "Day"Env-Switched URLs
Service URLs dihardcode di constructor controller dengan pattern:
if (config('app.env') === 'production') {
$this->url_dazo = 'https://app.dazo.id';
$this->url_engine = 'https://engine.dazo.id';
} else {
$this->url_dazo = 'http://localhost:8000';
$this->url_engine = 'http://localhost:5002';
}Tidak ada konfigurasi terpusat di .env untuk service URLs.
Date as String
Beberapa field tanggal disimpan sebagai string:
$store->expired_at = Carbon::now()->addMonths(1)->format('Y-m-d H:i');Perbandingan dilakukan secara lexicographic:
if ($store->expired_at < now()->format('Y-m-d H:i')) { ... }Controller Instantiation
Beberapa controller meng-instantiate controller lain secara langsung (bukan DI):
// OrderController.php
private $paymentController;
public function __construct()
{
$this->paymentController = new PaymentController();
}Ini anti-pattern — seharusnya extract ke service class.
MongoDB Raw Operations
Beberapa operasi menggunakan raw MongoDB:
// TicketingFeedbackController — $push
Ticket::raw(function ($collection) use ($id, $message) {
return $collection->updateOne(
['_id' => $id],
['$push' => ['chat' => $message]]
);
});
// AnalyticService — aggregation pipeline
User::raw(function ($collection) {
return $collection->aggregate([
['$lookup' => [...]],
['$group' => [...]],
]);
});Export Excel
Menggunakan Maatwebsite/Excel:
return Excel::download(new CustomersExport($customers), 'customers.xlsx');Export classes di app/Exports/.