๐ฅ Evolusi Arsitektur Laravel: Saatnya Atomic Query Construction (AQC) Ambil Alih


๐ก AQC vs FormRequest: Sebuah Lompatan Arsitektur
Dulu, banyak developer Laravel โ termasuk Aku โ memanfaatkan method handle()
di dalam FormRequest
. Tujuannya jelas: menyatukan validasi, otorisasi, dan penyimpanan data dalam satu tempat.
Tapi makin ke sini, pendekatan itu mulai terasa membatasi. Kenapa? Karena logika bisnis jadi terjebak di layer HTTP. Artinya, kalau Kamu ingin pakai logika yang sama untuk WebSocket, CLI, atau job terjadwal โ ya nggak bisa, atau minimal jadi ribet.
Solusinya? Tarik logika itu keluar dari FormRequest
, dan pindahkan ke class khusus yang lebih fleksibel: AQC (Atomic Query Construction).
๐ Apa Itu AQC (Atomic Query Construction)?
AQC adalah pola desain super ringan โ tanpa instalasi, tanpa binding โ yang memisahkan setiap aksi query ke dalam satu class tunggal.
Struktur folder-nya pun rapi dan predictable:
app/
โโโ AQC/
โโโ Product/
โโโ CreateProduct.php
โโโ UpdateProduct.php
โโโ GetAllProducts.php
โโโ GetProduct.php
โโโ DeleteProduct.php
Contoh isi GetAllProducts.php
:
namespace App\AQC\Product;
use App\Models\Product;
class GetAllProducts
{
public static function handle($params = [], $paginate = true, $scenario = 'default')
{
$productObj = Product::latest('id');
if (isset($params['category_id']) && $params['category_id'] > 0) {
$productObj->where('category_id', $params['category_id']);
}
if (isset($params['brand_id']) && $params['brand_id'] > 0) {
$productObj->where('brand_id', $params['brand_id']);
}
switch ($scenario) {
case 'minimal':
$productObj->select(['id', 'name']);
break;
case 'compact':
$productObj->select(['id', 'name', 'price', 'image']);
break;
case 'admin':
$productObj->select(['id', 'name', 'price', 'sku', 'image', 'stock', 'cost']);
break;
default:
$productObj->select('*');
}
return $paginate
? $productObj->paginate(Product::PAGINATE)
: $productObj->get();
}
}
๐ง Gimana Cara Pakainya?
AQC bisa dipanggil dari mana aja. Contoh di controller:
use App\Http\Requests\Product\GetAllProductsRequest;
use App\AQC\Product\GetAllProducts;
class ProductController extends Controller
{
public function index(GetAllProductsRequest $request)
{
$params = $request->all();
$product = GetAllProducts::handle($params);
return ResponseHelper::handle('index', $data);
}
}
๐ Cocok Buat Web, API, WebSocket, CLI โ Apa Aja!
โ Web/API route
Route::get('/products', [ProductController::class, 'index']);
โ WebSocket
use App\AQC\Product\GetAllProducts; class GetProductsHandler implements MessageComponentInterface { public function onMessage(ConnectionInterface $from, MessageInterface $message) { $filters = json_decode($message->getPayload(), true); $products = GetAllProducts::handle($filters); $from->send(json_encode($products)); } }
๐ง Mengikuti Prinsip Onion Architecture
Dengan pola ini, kita menciptakan arsitektur yang bersih dan scalable:
UI Layer = Web, API, WebSocket
Controller/Handler = Intermediary tipis
AQC = Pusat logika bisnis
๐ค Kenapa Nggak Pakai Service Class?
Kamu mungkin berpikir, "Bukannya ini kayak service biasa?"
Masalahnya, banyak service class di Laravel itu jadi keranjang statis yang isinya campur aduk. AQC memaksa disiplin:
๐น Atomic โ satu class = satu tugas
๐น Query-centric โ fokus ke aksi data
๐น Reusable โ nggak terikat layer tertentu
Dengan penamaan AQC, struktur jadi lebih jelas dan terorganisir.
โ Keuntungan AQC
๐ Kode lebih bersih, fokus, reusable
๐งช Mudah di-test
๐ฆ Tanpa package tambahan
๐ฑ Siap scaling tanpa glue code
๐ Semua aksi query terpusat, gampang tracking
โ๏ธ Penutup
AQC bukan satu-satunya cara, tapi sejauh ini ini adalah cara paling bersih yang Aku temukan untuk membangun arsitektur Laravel yang scalable, fleksibel, dan minim duplikasi kode.
Kalau Kamu lagi membangun aplikasi Laravel yang kompleks, coba deh terapin AQC. Sekali coba, bakal ketagihan.
Kalau Kamu suka artikel ini dan pengen lebih banyak insight seputar Laravel, teknologi, dan open source โ tinggal bilang, kita gas bareng tulis artikel-artikel kerennya ๐
Mau lanjut ke topik AQC lanjutan atau eksplor hal lain?
Subscribe to my newsletter
Read articles from Abd. Asis directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Abd. Asis
Abd. Asis
Im Fullstack Programmer from Indonesia