Laravel Observers Resource Collections Policy Filters Gate Before
Definisi
Tiga mekanisme Laravel untuk menjaga logika tetap rapi:
- Observer: kelas yang menangkap event lifecycle model (creating, created, updated, deleted) supaya efek samping tidak ditulis di controller.
- Resource & Collection: transformer yang menentukan bentuk JSON response secara konsisten, memisahkan data mentah dari representasi API.
- Policy Filters / Gate: otorisasi deklaratif, termasuk
Gate::beforedanauthorizeResourceuntuk CRUD otomatis.
Kapan dipakai
- Observer: saat model punya efek samping berulang (slug otomatis, log, sync cache) yang harus jalan tiap kali event terjadi.
- Resource/Collection: saat response API butuh shape berbeda dari struktur DB (sembunyikan field, gabung relasi).
- Policy/Gate: otorisasi terpusat untuk resource, terutama saat route resource otomatis.
Cara kerja
Observer
class UserObserver
{
public function creating(User $user)
{
$user->slug = Str::slug($user->name);
}
public function deleted(User $user)
{
Cache::forget("user:{$user->id}");
}
}
// daftarkan di EventServiceProvider $observers
protected $observers = [User::class => UserObserver::class];API Resource
class UserResource extends JsonResource
{
public function toArray($request): array
{
return [
'id' => $this->id,
'name' => $this->name,
// email sengaja tidak diikutkan
];
}
}
// pemakaian
return new UserResource($user);
return UserResource::collection($users); // pakai collectionPolicy filter dengan Gate::before
Gate::before(function ($user, $ability) {
if ($user->isAdmin) return true; // admin lolos semua
});
// route resource otomatis pakai policy
Route::resource('posts', PostController::class)->middleware('can:view,post');Struktur alur
Loading diagram...
Contoh kombinasi
public function store(Request $req)
{
$this->authorize('create', Post::class);
$post = Post::create($req->validated());
return new PostResource($post);
}Observer menangani slug, policy menangani izin, resource menangani shape — controller tetap tipis.
Catatan implementasi
- Observer jangan memanggil query berat di event
creatingyang bisa memicu event lain (loop). - Resource boleh memuat relasi, tapi hati-hati N+1; gunakan
with()di query. Gate::beforemengembalikannullbila bukan wewenangnya, agar policy lanjut mengecek.
Kesalahan umum
- Logika di controller padahal observer tersedia: duplikasi efek samping.
- Resource membocorkan field: lupa menyaring kolom sensitif.
- Gate::before selalu return true: mematikan semua policy berikutnya.
- N+1 di collection: tiap item load relasi sendiri karena lupa eager load.