Home Paket Belajar Bootcamp Instruktur

Tutorial Laravel Authorization #3 - Membuat dan Mendaftarkan Policies

Pelajari sistem Authorization di Laravel dari nol hingga implementasi dalam studi kasus nyata melalui 5 episode terstruktur. Ebook ini membahas konsep Authentication vs Authorization, Gates, Policies, fitur lanjutan, hingga menggabungkan seluruh konsep dalam sebuah aplikasi blog. Setiap materi dilengkapi penjelasan konsep, contoh kode siap pakai, tabel perbandingan, dan praktik terbaik agar mudah dipahami oleh developer Laravel pemula maupun menengah.

✅ Telah dilihat 28 kali

Rating: 5.00 ⭐

... 11 June 2026, 14:31

Setelah membaca episode ini, teman-teman akan bisa:

  • Membuat Policy menggunakan Artisan command
  • Memahami struktur dan method bawaan di dalam Policy
  • Mendaftarkan Policy ke model (auto-discovery vs manual)
  • Menggunakan Policy di controller dan Blade template

1. Membuat Policy dengan Artisan

Laravel menyediakan command untuk membuat Policy secara otomatis:

# Buat Policy kosong
php artisan make:policy PostPolicy

# Buat Policy dengan method CRUD lengkap (direkomendasikan)
php artisan make:policy PostPolicy --model=Post

File Policy akan dibuat di app/Policies/PostPolicy.php.


2. Struktur Policy

Berikut isi PostPolicy.php yang dihasilkan dari --model=Post:

<?php

namespace App\Policies;

use App\Models\Post;
use App\Models\User;

class PostPolicy
{
    /**
     * Apakah user boleh melihat daftar semua postingan?
     */
    public function viewAny(User $user): bool
    {
        return true; // semua user login boleh lihat daftar
    }

    /**
     * Apakah user boleh melihat postingan ini?
     */
    public function view(User $user, Post $post): bool
    {
        return true;
    }

    /**
     * Apakah user boleh membuat postingan baru?
     */
    public function create(User $user): bool
    {
        return true; // semua user login boleh buat postingan
    }

    /**
     * Apakah user boleh mengedit postingan ini?
     */
    public function update(User $user, Post $post): bool
    {
        return $user->id === $post->user_id; // hanya pemilik
    }

    /**
     * Apakah user boleh menghapus postingan ini?
     */
    public function delete(User $user, Post $post): bool
    {
        return $user->id === $post->user_id; // hanya pemilik
    }

    /**
     * Apakah user boleh memulihkan postingan yang di-soft-delete?
     */
    public function restore(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }

    /**
     * Apakah user boleh menghapus permanen?
     */
    public function forceDelete(User $user, Post $post): bool
    {
        return $user->role === 'admin';
    }
}

Tips: Tidak semua method harus dipakai. Hapus method yang tidak teman-teman butuhkan agar kode lebih bersih.


3. Mendaftarkan Policy

Auto-Discovery (Laravel 8+, Direkomendasikan)

Laravel secara otomatis menemukan Policy selama teman-teman mengikuti konvensi penamaan:

Model Policy
App\Models\Post App\Policies\PostPolicy
App\Models\Comment App\Policies\CommentPolicy

Selama file ada di folder yang benar dan namanya sesuai, tidak perlu registrasi manual.

Registrasi Manual (Jika Nama Tidak Konvensional)

Daftarkan di AppServiceProvider::boot():

use App\Models\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;

public function boot(): void
{
    Gate::policy(Post::class, PostPolicy::class);
}

4. Menggunakan Policy di Controller

Cara 1: $this->authorize()

Method ini tersedia secara otomatis di semua controller yang extend Controller:

<?php

namespace App\Http\Controllers;

use App\Models\Post;

class PostController extends Controller
{
    public function create()
    {
        $this->authorize('create', Post::class);
        return view('posts.create');
    }

    public function store(Request $request)
    {
        $this->authorize('create', Post::class);
        // simpan postingan...
    }

    public function edit(Post $post)
    {
        $this->authorize('update', $post); // kirim instance model
        return view('posts.edit', compact('post'));
    }

    public function update(Request $request, Post $post)
    {
        $this->authorize('update', $post);
        // update postingan...
    }

    public function destroy(Post $post)
    {
        $this->authorize('delete', $post);
        $post->delete();
        return redirect()->route('posts.index')->with('success', 'Postingan dihapus.');
    }
}

Perhatikan: Method yang tidak butuh model instance (seperti create) menerima nama class Post::class. Method yang butuh model spesifik (seperti updatedelete) menerima instance model $post.


5. Menggunakan Policy di Blade Template

Sama seperti Gate, Policy juga bisa digunakan dengan @can:

{{-- Tombol buat postingan baru --}}
@can('create', App\Models\Post::class)
    <a href="{{ route('posts.create') }}" class="btn btn-primary">+ Tulis Postingan</a>
@endcan

{{-- Tombol edit dan hapus (hanya untuk pemilik) --}}
@can('update', $post)
    <a href="{{ route('posts.edit', $post) }}">Edit</a>
@endcan

@can('delete', $post)
    <form action="{{ route('posts.destroy', $post) }}" method="POST">
        @csrf
        @method('DELETE')
        <button type="submit">Hapus</button>
    </form>
@endcan

6. Contoh Lengkap: PostController + PostPolicy

Skenario: Hanya pemilik postingan yang bisa edit dan hapus. Semua user yang login bisa melihat dan membuat postingan.

app/Policies/PostPolicy.php:

public function create(User $user): bool
{
    return true;
}

public function update(User $user, Post $post): bool
{
    return $user->id === $post->user_id;
}

public function delete(User $user, Post $post): bool
{
    return $user->id === $post->user_id;
}

app/Http/Controllers/PostController.php:

public function edit(Post $post)
{
    $this->authorize('update', $post);
    return view('posts.edit', compact('post'));
}

public function destroy(Post $post)
{
    $this->authorize('delete', $post);
    $post->delete();
    return redirect()->route('posts.index');
}

Ringkasan Episode

  • Buat Policy dengan php artisan make:policy PostPolicy --model=Post
  • Ikuti konvensi nama agar auto-discovery bekerja (Post → PostPolicy)
  • Gunakan $this->authorize('update', $post) di controller
  • Gunakan @can('update', $post) di Blade template
  • Method tanpa model pakai Post::class; method dengan model pakai $post

Preview Episode Berikutnya

Di Episode 4, kita akan belajar fitur canggih di dalam Policy: method before() untuk super-admin bypass, membuat Policy untuk user yang belum login (guest), dan menggunakan Policy via middleware route.

Daftar eBook