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.
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.