Study
Phoenix

Plug Custom & Middleware

Penjelasan

Plug custom dibuat sebagai modul yang mengimplementasikan dua fungsi wajib: init/1 untuk menyiapkan opsi saat compile time, dan call/2 yang menerima conn dan opts lalu mengembalikan conn baru (biasanya dimodifikasi lewat assign atau halt jika ingin menghentikan request). Plug fungsi (bukan modul) juga bisa dibuat langsung sebagai fungsi biasa di dalam controller atau router jika logicnya sederhana. Plug custom sangat berguna untuk logic lintas endpoint seperti memeriksa header API key, mencatat log request, atau membatasi rate limit. Setelah dibuat, plug tinggal ditambahkan ke dalam pipeline di router.ex atau dipanggil langsung di dalam controller lewat plug :nama_fungsi.

Contoh Konsep

defmodule TokoAppWeb.Plugs.CekApiKey do
  import Plug.Conn

  def init(opts), do: opts

  def call(conn, _opts) do
    case get_req_header(conn, "x-api-key") do
      ["rahasia123"] ->
        conn

      _ ->
        conn
        |> put_status(:unauthorized)
        |> Phoenix.Controller.json(%{error: "unauthorized"})
        |> halt()
    end
  end
end

# Di router.ex:
# pipeline :api do
#   plug :accepts, ["json"]
#   plug TokoAppWeb.Plugs.CekApiKey
# end

Praktikum

Buat plug LogWaktuAkses yang mencatat timestamp saat ini ke Logger setiap kali ada request masuk, lalu meneruskan conn tanpa perubahan.

Editor Latihan

Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.

Tips

Selalu panggil halt/1 setelah mengirim response di dalam plug jika ingin menghentikan pipeline lebih awal, kalau tidak Phoenix akan tetap melanjutkan ke plug berikutnya.