Tutorial Laravel 12 – Membuat Website Blog Berita – Bagian #1 (CRUD Post)

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 berita
  • create() : Form tambah berita
  • store() : Simpan berita ke database
  • show() : Detail berita
  • edit() : Form edit berita
  • update() : Perbarui berita
  • destroy() : 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.

Tags :

Leave a Reply

Your email address will not be published. Required fields are marked *

nineteen − eight =

Tutorial Terpopuler

Tutorial Pilihan

Tentang Gurututorku

Gurututorku adalah sebuah kursus online maupun offline yang menyediakan berbagai macam tutorial tentang pemrograman, design, dan multimedia serta artikel teknologi yang tentunya bisa dinikmati dan dipelajari oleh semua orang yang baru ingin belajar dunia IT.

© 2024 – Gurututorku.com | Learning today success tomorrow.