Pembuatan web berita menggunakan Laravel diawali dengan tahap persiapan yang mencakup perencanaan struktur aplikasi, instalasi lingkungan pengembangan, serta konfigurasi awal framework. Laravel dipilih karena menyediakan sistem MVC (Model-View-Controller) yang terorganisir, fitur autentikasi bawaan, dan kemudahan dalam membuat CRUD (Create, Read, Update, Delete).
1. Persiapan Awal
Tahap ini memastikan seluruh kebutuhan sistem telah siap agar Laravel dapat berjalan dengan optimal.
Pastikan sudah terinstal:
- PHP ≥ 8.1
- Composer
- MySQL / MariaDB
- Web browser
Buat project baru:
composer create-project laravel/laravel blogberitalaravel cd blogberitalaravel
Konfigurasi Database di file .env:
DB_CONNECTION=mysql DB_DATABASE=beritadb DB_USERNAME=root DB_PASSWORD=
Migrasi Awal : migrasikan tabel default:
php artisan migrate
Migrasi ini akan membuat tabel default Laravel.
2. Membuat Model dan Migration Berita
Model dan migration digunakan untuk mendefinisikan struktur tabel berita dan logika datanya.
Kita akan membuat model Post untuk menyimpan berita.
php artisan make:model Post -m
Edit file migration di database/migrations/xxxx_create_posts_table.php:
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->string('author')->default('Admin');
$table->timestamps();
});
}
Jalankan migrasi:
php artisan migrate
Edit file Model Post.php di app/Models/Post.php:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
// Kolom yang bisa diisi (fillable)
protected $fillable = [
'title',
'content',
'author',
];
}
protected $fillable = [‘title’,’content’,’author’]; Digunakan untuk keamanan mass assignment.
3. Membuat Controller Berita
Controller bertanggung jawab menangani proses CRUD berita.
Membuat Resource Controller
php artisan make:controller PostController --resource
Fungsi Utama Controller
index(): Menampilkan daftar beritacreate(): Form tambah beritastore(): Simpan berita ke databaseshow(): Detail beritaedit(): Form edit beritaupdate(): Perbarui beritadestroy(): Hapus berita
Controller juga memanfaatkan validasi request bawaan Laravel.
Edit file app/Http/Controllers/PostController.php:
<?php namespace App\Http\Controllers; use App\Models\Post; use Illuminate\Http\Request;
class PostController extends Controller
{
public function index()
{
$posts = Post::latest()->paginate(5);
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($request->all());
return redirect()->route('posts.index')->with('success', 'Berita berhasil ditambahkan!');
}
public function show(Post $post)
{
return view('posts.show', compact('post'));
}
public function edit(Post $post)
{
return view('posts.edit', compact('post'));
}
public function update(Request $request, Post $post)
{
$request->validate([
'title' => 'required',
'content' => 'required',
]);
$post->update($request->all());
return redirect()->route('posts.index')->with('success', 'Berita berhasil diperbarui!');
}
public function destroy(Post $post)
{
$post->delete();
return redirect()->route('posts.index')->with('success', 'Berita berhasil dihapus!');
}
}
4. Routing Aplikasi
Routing menghubungkan URL dengan controller.
Edit file routes/web.php:
use App\Http\Controllers\PostController;
Route::get('/', function () {
return redirect()->route('posts.index');
});
Route::resource('posts', PostController::class);
Dengan satu baris resource route, Laravel otomatis membuat seluruh route CRUD.
5. Pembuatan View (Blade Template)
View digunakan untuk menampilkan data ke pengguna.
Struktur Folder View
- resources/views/
- ├── layouts/app.blade.php
- └── posts/
- ├── index.blade.php
- ├── create.blade.php
- ├── edit.blade.php
- └── show.blade.php
Fungsi Masing-masing View
- index: Menampilkan daftar berita + pagination
- create: Form tambah berita
- edit: Form edit berita
- show: Detail berita
- layout: Template utama aplikasi
Blade memudahkan penggunaan @extends, @section, @foreach, dan @csrf.
Buat folder resources/views/posts.
resources/views/posts/index.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<h1>Daftar Berita</h1>
<a href="{{ route('posts.create') }}" class="btn btn-primary mb-3">+ Tambah Berita</a>
@if(session('success'))
<div class="alert alert-success">{{ session('success') }}</div>
@endif
<table class="table table-bordered">
<tr>
<th>Judul</th>
<th>Penulis</th>
<th>Tanggal</th>
<th>Aksi</th>
</tr>
@foreach ($posts as $post)
<tr>
<td>{{ $post->title }}</td>
<td>{{ $post->author }}</td>
<td>{{ $post->created_at->format('d M Y') }}</td>
<td>
<a href="{{ route('posts.show', $post) }}" class="btn btn-info btn-sm">Lihat</a>
<a href="{{ route('posts.edit', $post) }}" class="btn btn-warning btn-sm">Edit</a>
<form action="{{ route('posts.destroy', $post) }}" method="POST" style="display:inline;">
@csrf @method('DELETE')
<button class="btn btn-danger btn-sm" onclick="return confirm('Yakin hapus?')">Hapus</button>
</form>
</td>
</tr>
@endforeach
</table>
{{ $posts->links() }}
</div>
@endsection
resources/views/posts/create.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<h1>Tambah Berita</h1>
<form action="{{ route('posts.store') }}" method="POST">
@csrf
<div class="mb-3">
<label>Judul</label>
<input type="text" name="title" class="form-control" required>
</div>
<div class="mb-3">
<label>Isi Berita</label>
<textarea name="content" class="form-control" rows="5" required></textarea>
</div>
<button class="btn btn-success">Simpan</button>
<a href="{{ route('posts.index') }}" class="btn btn-secondary">Kembali</a>
</form>
</div>
@endsection
resources/views/posts/edit.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<h1>Edit Berita</h1>
<form action="{{ route('posts.update', $post) }}" method="POST">
@csrf @method('PUT')
<div class="mb-3">
<label>Judul</label>
<input type="text" name="title" value="{{ $post->title }}" class="form-control" required>
</div>
<div class="mb-3">
<label>Isi Berita</label>
<textarea name="content" class="form-control" rows="5" required>{{ $post->content }}</textarea>
</div>
<button class="btn btn-primary">Update</button>
<a href="{{ route('posts.index') }}" class="btn btn-secondary">Kembali</a>
</form>
</div>
@endsection
resources/views/posts/show.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<h1>{{ $post->title }}</h1>
<p><strong>Penulis:</strong> {{ $post->author }}</p>
<p>{{ $post->content }}</p>
<a href="{{ route('posts.index') }}" class="btn btn-secondary">Kembali</a>
</div>
@endsection
resources/views/layouts/app.blade.php
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<title>Blog Berita</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
@yield('content')
</body>
</html>
6. Menjalankan Aplikasi
Tahap akhir untuk menguji aplikasi.
php artisan serve
Lalu buka di browser:
👉 localhost:8000/posts atau http://127.0.0.1:8000/posts
7. Penguatan Konsep MVC pada Laravel
Model
Mengelola data dan berinteraksi langsung dengan database menggunakan Eloquent ORM.
View
Mengatur tampilan aplikasi menggunakan Blade Template.
Controller
Menjembatani Model dan View serta menangani logika aplikasi.
