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-81). UserstampsMacro adalah satu-satunya implementasi kontrak itu di repository, dan provider memanggilnya sekali saat package di-boot lewat bootingPackage() (src/UserstampsServiceProvider.php:21-242).
Urutan registrasi
UserstampsMacro::register() memanggil empat method privat berurutan: registerUserstamps(), registerSoftUserstamps(), registerDropUserstamps(), lalu registerDropSoftUserstamps() (src/Database/Schema/Macros/UserstampsMacro.php:9-153). 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-704).
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.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-545). Karena itu nilai bawaan created_by menghasilkan created_by_id (config/userstamps.php:846).
| Macro | Kolom saat is_using_morph = false | Kolom saat is_using_morph = true | Rujukan |
|---|---|---|---|
userstamps | created_by_id, updated_by_id | ditambah created_by_type, updated_by_type | src/Database/Schema/Macros/UserstampsMacro.php:50-704 |
softUserstamps | deleted_by_id | ditambah deleted_by_type | src/Database/Schema/Macros/UserstampsMacro.php:72-857 |
dropUserstamps | dropForeign untuk dua kolom, lalu dropColumn | dropColumn empat kolom tanpa dropForeign | src/Database/Schema/Macros/UserstampsMacro.php:87-1068 |
dropSoftUserstamps | dropForeign untuk satu kolom, lalu dropColumn | dropColumn dua kolom tanpa dropForeign | src/Database/Schema/Macros/UserstampsMacro.php:108-1249 |
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-6610). Nilai bawaan config tersebut adalah false, sehingga instalasi standar hanya mendapat kolom _id (config/userstamps.php:1811). 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-2212). Ekspresi match kemudian memetakan tipe kolom ke method Blueprint yang sesuai, dan setiap cabang memanggil nullable() (src/Database/Schema/Macros/UserstampsMacro.php:24-4013).
users_table_id_column_type | is_using_morph = false | is_using_morph = true |
|---|---|---|
bigIncrements | foreignId() | unsignedBigInteger() |
uuid | foreignUuid() | uuid() |
ulid | foreignUlid() | ulid() |
nilai lain, termasuk increments | unsignedInteger() | unsignedInteger() |
Nilai bawaan config adalah bigIncrements (config/userstamps.php:52-6014). 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-3915).
⚠️
dropUserstampsdandropSoftUserstampsbersifat destruktif: keduanya memanggil$this->dropColumn($columns)tanpa pemeriksaan keberadaan kolom, sehingga rollback migration harus dijalankan berurutan (src/Database/Schema/Macros/UserstampsMacro.php:10216).
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-4717). 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-10018), sedangkan dropSoftUserstamps menjalankan dropForeign hanya untuk deleted_by_id (src/Database/Schema/Macros/UserstampsMacro.php:116-11819). 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-1120). 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.