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

Abd. AsisAbd. Asis
3 min read

๐Ÿ’ก 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?

0
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