Study
Phoenix

Context Module (Phoenix Contexts Pattern)

Penjelasan

Context adalah pola arsitektur khas Phoenix untuk mengelompokkan fungsi-fungsi terkait domain bisnis tertentu, misalnya Catalog untuk urusan produk atau Accounts untuk urusan user, ke dalam satu modul publik. Controller tidak lagi memanggil Repo atau Ecto.Query secara langsung, melainkan memanggil fungsi dari context seperti Catalog.list_produk/0 atau Catalog.create_produk/1. Dengan pola ini, detail implementasi database (Ecto, query, changeset) tersembunyi di dalam context, sehingga jika suatu saat implementasi berubah, controller tidak perlu ikut berubah. Context juga menjadi batas alami untuk pengujian, karena kita bisa mengetes logic bisnis tanpa perlu mensimulasikan HTTP request sama sekali.

Contoh Konsep

defmodule TokoApp.Catalog do
  alias TokoApp.Repo
  alias TokoApp.Catalog.Produk

  def list_produk do
    Repo.all(Produk)
  end

  def get_produk!(id), do: Repo.get!(Produk, id)

  def create_produk(attrs \\ %{}) do
    %Produk{}
    |> Produk.changeset(attrs)
    |> Repo.insert()
  end
end

# Di controller cukup panggil:
# produk_list = TokoApp.Catalog.list_produk()

Praktikum

Buat modul context BlogApp.Content dengan fungsi list_artikel dan create_artikel yang memanggil Repo dan changeset Artikel.

Editor Latihan

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

Tips

Beri nama context sesuai bahasa domain bisnis (ubiquitous language), bukan sesuai nama tabel database, supaya context tetap masuk akal walau struktur tabel berubah.