Membuat Forum Diskusi Sederhana di Laravel 12 dengan Breeze + Policy

Oleh 5E AKBAR PUTRA WIRATAMA di 25 Sep 2025 | 20:07
5E AKBAR PUTRA WIRATAMA

5E AKBAR PUTRA WIRATAMA

Siswa
Postingan: 1
Anggota sejak: 9 Sep 2025

Saya ingin share hasil eksplorasi mandiri tentang membuat forum diskusi sederhana menggunakan Laravel 12, memanfaatkan Breeze untuk autentikasi dan Policies untuk mengatur hak akses.

Studi kasus:

  • Admin → bisa mengedit & menghapus semua postingan

  • User → hanya bisa mengedit & menghapus postingannya sendiri

Berikut langkah-langkah dan kode implementasinya:


Persiapan Project Laravel

composer create-project laravel/laravel forum-laravel12 cd forum-laravel12 # Install Breeze composer require laravel/breeze --dev php artisan breeze:install npm install && npm run dev php artisan migrate # Jalankan server php artisan serve

Model & Migration Post

php artisan make:model Post -m

Migration posts:

Schema::create('posts', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->string('title'); $table->text('content'); $table->timestamps(); });
php artisan migrate

Relasi Model

Post.php

class Post extends Model { use HasFactory; protected $fillable = ['title','content','user_id']; public function user() { return $this->belongsTo(User::class); } }

User.php

public function posts() { return $this->hasMany(Post::class); }

Policy

php artisan make:policy PostPolicy --model=Post

PostPolicy.php

class PostPolicy { public function update(User $user, Post $post): bool { return $user->id === $post->user_id || $user->role === 'admin'; } public function delete(User $user, Post $post): bool { return $user->id === $post->user_id || $user->role === 'admin'; } }

Catatan: Laravel 12 otomatis mengenali Policy, tidak perlu daftar manual.


5️⃣ Controller

php artisan make:controller PostController --resource

PostController.php

use App\Models\Post; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; class PostController extends Controller { use AuthorizesRequests; public function index() { $posts = Post::with('user')->latest()->get(); return view('posts.index', compact('posts')); } public function create() { return view('posts.create'); } public function store(Request $request) { $request->validate(['title'=>'required','content'=>'required']); Post::create([ 'title'=>$request->title, 'content'=>$request->content, 'user_id'=>auth()->id(), ]); return redirect()->route('posts.index'); } public function edit(Post $post) { $this->authorize('update',$post); return view('posts.edit', compact('post')); } public function update(Request $request, Post $post) { $this->authorize('update',$post); $request->validate(['title'=>'required','content'=>'required']); $post->update($request->only('title','content')); return redirect()->route('posts.index'); } public function destroy(Post $post) { $this->authorize('delete',$post); $post->delete(); return redirect()->route('posts.index'); } }

Routing

use App\Http\Controllers\PostController; Route::middleware(['auth'])->group(function () { Route::resource('posts', PostController::class); });

Views

index.blade.php

<x-app-layout> <h2 class="text-xl font-bold mb-4 text-center">Forum Diskusi</h2> <div class="flex justify-center mb-6"> <a href="{{ route('posts.create') }}" class="px-4 py-2 bg-gray-500 text-white rounded-full shadow-md hover:bg-gray-700 transition">Buat Post</a> </div> <div class="space-y-4 max-w-md mx-auto"> @foreach($posts as $post) <div class="p-4 border rounded-lg shadow-sm bg-white"> <h3 class="font-bold text-lg">{{ $post->title }}</h3> <p class="mb-2">{{ $post->content }}</p> <small class="text-gray-500">By: {{ $post->user->name }}</small> <div class="mt-3 flex space-x-2"> @can('update',$post) <a href="{{ route('posts.edit',$post) }}" class="px-3 py-1 bg-gray-500 text-white rounded-full shadow-md hover:bg-gray-700 transition">Edit</a> @endcan @can('delete',$post) <form action="{{ route('posts.destroy',$post) }}" method="POST" class="inline"> @csrf @method('DELETE') <button type="submit" class="px-3 py-1 bg-red-600 text-white rounded-full shadow-md hover:bg-red-700 transition">Delete</button> </form> @endcan </div> </div> @endforeach </div> </x-app-layout>

create.blade.php & edit.blade.php sama konsep, hanya berbeda action dan title.


Dashboard Link ke Forum

<div class="mt-6 flex justify-center pb-6"> <a href="{{ route('posts.index') }}" class="px-6 py-2 bg-gray-500 text-white font-semibold rounded-full shadow-md hover:bg-gray-700 transition">Masuk ke Forum</a> </div>

Demo

  • Login sebagai admin → bisa edit & hapus semua post

  • Login sebagai user → hanya bisa edit & hapus postingannya sendiri

Forum tampil sederhana, tombol seragam (abu-abu default, hijau untuk simpan, merah untuk delete).


Dengan Breeze dan Policies, forum diskusi sudah cukup aman, terstruktur, dan bisa dikembangkan lebih lanjut.

kode: https://github.com/AkbarPutraWiratama/Framework-Pemograman-Web

25 Sep 2025 | 20:07
0 Suka

Laporkan

Silakan jelaskan laporan secara singkat dan jelas.