Lompat ke konten
dokumentasi.id
Commit 159d6ac
v1
Star1

2.1

Lapisan Schema dan Macro Blueprint

Lapisan schema paket ini tidak menambah kelas builder baru. Ia hanya menempelkan empat macro ke Illuminate\Database\Schema\Blueprint, sehingga setiap migration tetap memakai API Blueprint yang sudah dikenal. Kontraknya sengaja minimal: MacroInterface hanya mewajibkan satu method, yaitu register() tanpa parameter dan tanpa nilai balik (src/Database/Schema/Macros/MacroInterface.php:5-8). UserstampsMacro adalah satu-satunya implementasi kontrak itu di repository, dan provider memanggilnya sekali saat package di-boot lewat bootingPackage() (src/UserstampsServiceProvider.php:21-24).

Urutan registrasi

UserstampsMacro::register() memanggil empat method privat berurutan: registerUserstamps(), registerSoftUserstamps(), registerDropUserstamps(), lalu registerDropSoftUserstamps() (src/Database/Schema/Macros/UserstampsMacro.php:9-15). Setiap method privat mendaftarkan tepat satu macro beserta closure-nya. Semua closure mengembalikan $this, sehingga pemanggilan macro bisa dirantai di dalam Schema::create maupun Schema::table (src/Database/Schema/Macros/UserstampsMacro.php:50-70).

graph TD
  BOOT["bootingPackage()"] --> REG["UserstampsMacro::register()"]
  REG --> MU["userstamps"]
  REG --> MS["softUserstamps"]
  REG --> DU["dropUserstamps"]
  REG --> DS["dropSoftUserstamps"]
  MU --> A1["addUserIdColumn: created_by_id"]
  MU --> A2["addUserIdColumn: updated_by_id"]
  MU --> A3["created_by_type (morph only)"]
  MU --> A4["updated_by_type (morph only)"]
  MS --> B1["addUserIdColumn: deleted_by_id"]
  MS --> B2["deleted_by_type (morph only)"]
  DU --> C1["dropForeign + dropColumn"]
  DS --> D1["dropForeign + dropColumn"]
  style BOOT fill:#f59e0b,color:#000
  style REG fill:#f59e0b,color:#000
  style MU fill:#8b5cf6,color:#fff
  style MS fill:#8b5cf6,color:#fff
  style DU fill:#dc2626,color:#fff
  style DS fill:#dc2626,color:#fff
  style A1 fill:#336791,color:#fff
  style A2 fill:#336791,color:#fff
  style B1 fill:#336791,color:#fff
  style A3 fill:#8b5cf6,color:#fff
  style A4 fill:#8b5cf6,color:#fff
  style B2 fill:#8b5cf6,color:#fff
  style C1 fill:#dc2626,color:#fff
  style D1 fill:#dc2626,color:#fff
%% fig: Pemetaan empat macro ke kolom yang dihasilkan
%% desc: register() mendaftarkan empat macro; macro penambah kolom memanggil addUserIdColumn, sedangkan macro drop menghapus foreign key lalu kolomnya.
Fig. 1: Pemetaan empat macro ke kolom yang dihasilkanregister() mendaftarkan empat macro; macro penambah kolom memanggil addUserIdColumn, sedangkan macro drop menghapus foreign key lalu kolomnya.

Kolom yang dihasilkan setiap macro

Nama kolom tidak ditulis harfiah di dalam macro. Setiap closure membaca nilai config created_by_column, updated_by_column, atau deleted_by_column, lalu menambahkan sufiks _id (src/Database/Schema/Macros/UserstampsMacro.php:52-54). Karena itu nilai bawaan created_by menghasilkan created_by_id (config/userstamps.php:84).

MacroKolom saat is_using_morph = falseKolom saat is_using_morph = trueRujukan
userstampscreated_by_id, updated_by_idditambah created_by_type, updated_by_typesrc/Database/Schema/Macros/UserstampsMacro.php:50-70
softUserstampsdeleted_by_idditambah deleted_by_typesrc/Database/Schema/Macros/UserstampsMacro.php:72-85
dropUserstampsdropForeign untuk dua kolom, lalu dropColumndropColumn empat kolom tanpa dropForeignsrc/Database/Schema/Macros/UserstampsMacro.php:87-106
dropSoftUserstampsdropForeign untuk satu kolom, lalu dropColumndropColumn dua kolom tanpa dropForeignsrc/Database/Schema/Macros/UserstampsMacro.php:108-124

Kolom _type selalu dibuat dengan $this->string(...)->nullable(), jadi hanya muncul ketika config is_using_morph bernilai benar (src/Database/Schema/Macros/UserstampsMacro.php:58-66). Nilai bawaan config tersebut adalah false, sehingga instalasi standar hanya mendapat kolom _id (config/userstamps.php:18). Pembahasan konsekuensi morph ada di Mode Morph dan Tipe Kolom ID.

Memilih tipe kolom lewat match

Inti lapisan ini ada di addUserIdColumn(). Method itu membaca empat nilai config sekaligus: is_using_morph, users_table_id_column_type, users_table, dan users_table_id_column_name (src/Database/Schema/Macros/UserstampsMacro.php:17-22). Ekspresi match kemudian memetakan tipe kolom ke method Blueprint yang sesuai, dan setiap cabang memanggil nullable() (src/Database/Schema/Macros/UserstampsMacro.php:24-40).

users_table_id_column_typeis_using_morph = falseis_using_morph = true
bigIncrementsforeignId()unsignedBigInteger()
uuidforeignUuid()uuid()
ulidforeignUlid()ulid()
nilai lain, termasuk incrementsunsignedInteger()unsignedInteger()

Nilai bawaan config adalah bigIncrements (config/userstamps.php:52-60). Daftar opsi di komentar config menyebut increments, tetapi match tidak punya arm khusus untuk nilai itu, sehingga increments jatuh ke arm default dan menghasilkan unsignedInteger(). Kedua cabang arm default juga identik, jadi morph tidak mengubah hasilnya (src/Database/Schema/Macros/UserstampsMacro.php:37-39).

⚠️ dropUserstamps dan dropSoftUserstamps bersifat destruktif: keduanya memanggil $this->dropColumn($columns) tanpa pemeriksaan keberadaan kolom, sehingga rollback migration harus dijalankan berurutan (src/Database/Schema/Macros/UserstampsMacro.php:102).

Cabang non-morph dan foreign key

Ketika is_using_morph bernilai false, addUserIdColumn() menambahkan constraint foreign key setelah kolom dibuat. Constraint itu merujuk kolom users_table_id_column_name pada tabel users_table dan memakai nullOnDelete() (src/Database/Schema/Macros/UserstampsMacro.php:42-47). Opsi users_table dan users_table_id_column_name dijelaskan satu per satu di Referensi Opsi Konfigurasi.

Karena foreign key hanya dibuat di cabang non-morph, macro drop juga membaliknya secara berbeda: dropUserstamps menjalankan dropForeign untuk created_by_id dan updated_by_id (src/Database/Schema/Macros/UserstampsMacro.php:97-100), sedangkan dropSoftUserstamps menjalankan dropForeign hanya untuk deleted_by_id (src/Database/Schema/Macros/UserstampsMacro.php:116-118). Di cabang morph, tidak ada foreign key yang perlu dilepas, jadi hanya kolom yang dihapus.

Stub untuk IDE dan static analysis

Repository menyertakan stubs/Blueprint.php berisi kelas kosong di namespace Illuminate\Database\Schema dengan empat anotasi @method untuk userstamps(), softUserstamps(), dropUserstamps(), dan dropSoftUserstamps() (stubs/Blueprint.php:5-11). Berkas ini tidak dipakai saat runtime; fungsinya memberi petunjuk tipe pada IDE dan alat analisis statis agar pemanggilan macro dikenali sebagai method Blueprint. Pemakaian macro di dalam berkas migration dibahas di Migrasi dan Kolom Userstamps, sedangkan posisi lapisan ini di antara komponen paket lain dibahas di Arsitektur Paket.