Tutorial CRUD Laravel 11, MySQL 8, Breeze, Spatie: Bikin Website Perpustakaan Online

Pada artikel ini, kita akan belajar membuat website perpustakaan online dengan fitur login dan register menggunakan Laravel 11, MySQL 8, dan Breeze. Website ini akan memiliki beberapa fitur utama seperti pencarian buku berdasarkan kategori, melihat detail buku, peminjaman buku (hanya bisa dilakukan setelah login), dan pengelolaan stok buku oleh admin.

Fitur Utama Website Perpustakaan Online

Beberapa fitur utama yang akan kita bangun dalam proyek ini meliputi:

  • Pencarian buku berdasarkan kategori: Pengguna dapat mencari buku dengan memilih kategori tertentu.
  • Melihat detail buku: Setiap buku akan memiliki halaman detail yang memuat informasi lengkap seperti judul, penulis, deskripsi, dan ketersediaan stok.
  • Peminjaman buku (wajib login): Pengguna yang telah login bisa meminjam buku, sedangkan pengguna yang belum login akan diarahkan ke halaman login.
  • Pengelolaan stok buku: Admin memiliki akses untuk menambah, mengedit, dan menghapus buku serta mengelola stok buku.

Instalasi PHP, MySQL, Composer, dan MAMP

Sebelum memulai proyek Laravel, ada beberapa perangkat yang perlu diinstal terlebih dahulu. Berikut langkah-langkah untuk menginstalnya:

1. Instalasi PHP

Laravel membutuhkan PHP minimal versi 8.0. Untuk memeriksa apakah PHP sudah terinstal di komputer kamu, buka terminal atau command prompt dan ketik:

php -v

Jika belum ada PHP, kamu bisa mendownload dan menginstal MAMP. MAMP adalah software yang menyediakan lingkungan web development yang sudah termasuk PHP dan MySQL.

2. Instalasi MySQL

MySQL adalah database yang akan kita gunakan untuk menyimpan data buku, pengguna, dan peminjaman. Setelah MAMP terinstal, MySQL biasanya sudah otomatis terinstal juga. Untuk memeriksa, buka MAMP dan pastikan server MySQL aktif.

3. Instalasi Composer

Composer adalah package manager untuk PHP yang akan kita gunakan untuk menginstal Laravel. Untuk menginstal Composer, kunjungi situs resmi Composer dan ikuti instruksi instalasi yang sesuai dengan sistem operasi kamu.

Setelah Composer terinstal, periksa instalasinya dengan menjalankan perintah berikut di terminal:

composer -v

Jika Composer sudah terinstal dengan benar, kamu akan melihat versi Composer yang terpasang.

4. Menginstal MAMP

MAMP adalah software yang menyatukan Apache, PHP, dan MySQL dalam satu paket. Untuk menginstalnya:

  1. Download MAMP dari situs resmi MAMP.
  2. Setelah download selesai, lakukan instalasi seperti software biasa.
  3. Jalankan MAMP, dan pastikan server Apache dan MySQL aktif.

Dengan menggunakan MAMP, kita tidak perlu mengkonfigurasi MySQL secara manual karena sudah terintegrasi dengan MAMP.

Cara Membuat Proyek Laravel dan Menginstal Laravel Breeze

Setelah semua perangkat terinstal (PHP, MySQL, Composer, dan MAMP), kita bisa mulai membuat proyek Laravel untuk website perpustakaan online.

1. Membuat Proyek Laravel

Untuk membuat proyek Laravel, buka terminal atau command prompt dan jalankan perintah berikut:

composer create-project laravel/laravel perpustakaan_online

Perintah ini akan mengunduh dan menginstal Laravel versi terbaru. Setelah selesai, masuk ke direktori proyek:

cd perpustakaan_online

2. Mengonfigurasi Environment

Sebelum melanjutkan, kita harus mengonfigurasi file .env untuk menghubungkan aplikasi ke database. Cari file .env di root direktori proyek, lalu ubah pengaturan berikut sesuai dengan konfigurasi database MySQL yang telah dibuat:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=perpustakaan_db
DB_USERNAME=root
DB_PASSWORD=

3. Menginstal Laravel Breeze

Laravel Breeze digunakan untuk menyediakan sistem otentikasi yang sederhana namun efektif. Untuk menginstal Breeze, jalankan perintah berikut di terminal:

composer require laravel/breeze --dev

Setelah instalasi selesai, jalankan perintah untuk menginstal file Breeze:

php artisan breeze:install

Kemudian jalankan migrasi dan npm untuk membangun file frontend:

php artisan migrate
npm install
npm run dev

Breeze sekarang telah diinstal dan sistem login/register siap digunakan di website perpustakaan online.

Cara Membuat Migration untuk Tabel books, categories, borrowers, loans, dan returns

Setelah sistem otentikasi siap, kita akan membuat database untuk menyimpan data buku, kategori, peminjam, pinjaman, dan pengembalian.

1. Membuat Migration Tabel books

Untuk membuat migration tabel books, jalankan perintah:

php artisan make:migration create_books_table

Kemudian, buka file migrasi di direktori database/migrations dan tambahkan skema berikut:

Schema::create('books', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->string('author');
    $table->text('description')->nullable();
    $table->integer('stock');
    $table->unsignedBigInteger('category_id');
    $table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
    $table->timestamps();
});

2. Membuat Migration Tabel categories

Untuk membuat migration tabel categories, jalankan perintah:

php artisan make:migration create_categories_table

Kemudian tambahkan skema berikut:

Schema::create('categories', function (Blueprint $table) {
    $table->id();
    $table->string('name');
    $table->timestamps();
});

3. Membuat Migration Tabel borrowers

Jalankan perintah berikut untuk membuat migration tabel borrowers:

php artisan make:migration create_borrowers_table

Tambahkan skema berikut:

Schema::create('borrowers', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('user_id');
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->timestamps();
});

4. Membuat Migration Tabel loans

Untuk membuat tabel loans, jalankan perintah:

php artisan make:migration create_loans_table

Kemudian tambahkan skema:

Schema::create('loans', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('book_id');
    $table->unsignedBigInteger('borrower_id');
    $table->date('loan_date');
    $table->date('return_date')->nullable();
    $table->foreign('book_id')->references('id')->on('books')->onDelete('cascade');
    $table->foreign('borrower_id')->references('id')->on('borrowers')->onDelete('cascade');
    $table->timestamps();
});

5. Membuat Migration Tabel returns

Untuk membuat tabel returns, jalankan perintah:

php artisan make:migration create_returns_table

Tambahkan skema berikut:

Schema::create('returns', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('loan_id');
    $table->date('returned_at');
    $table->foreign('loan_id')->references('id')->on('loans')->onDelete('cascade');
    $table->timestamps();
});

Cara Membuat Model dengan Fillable Mass Assignment dan ORM Relationships

Setelah membuat migration, kita akan membuat model yang mewakili masing-masing tabel dan mengatur fillable serta relasi antar tabel menggunakan ORM (Object-Relational Mapping) di Laravel.

1. Model Book

Buat model untuk tabel books dengan perintah:

php artisan make:model Book

Kemudian tambahkan fillable dan relasi belongsTo dengan Category, serta relasi hasMany dengan Loan:

class Book extends Model
{
    protected $fillable = ['title', 'author', 'description', 'stock', 'category_id'];

    public function category()
    {
        return $this->belongsTo(Category::class);
    }

    public function loans()
    {
        return $this->hasMany(Loan::class);
    }
}

2. Model Category

Buat model untuk tabel categories dengan perintah:

php artisan make:model Category

Tambahkan fillable dan relasi hasMany dengan Book:

class Category extends Model
{
    protected $fillable = ['name'];

    public function books()
    {
        return $this->hasMany(Book::class);
    }
}

3. Model Borrower

Buat model untuk tabel borrowers dengan perintah:

php artisan make:model Borrower

Tambahkan fillable dan relasi belongsTo dengan User, serta relasi hasMany dengan Loan:

class Borrower extends Model
{
    protected $fillable = ['user_id'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function loans()
    {
        return $this->hasMany(Loan::class);
    }
}

4. Model Loan

Buat model untuk tabel loans dengan perintah:

php artisan make:model Loan

Tambahkan fillable dan relasi belongsTo dengan Book dan Borrower, serta relasi hasOne dengan Return:

class Loan extends Model
{
    protected $fillable = ['book_id', 'borrower_id', 'loan_date', 'return_date'];

    public function book()
    {
        return $this->belongsTo(Book::class);
    }

    public function borrower()
    {
        return $this->belongsTo(Borrower::class);
    }

    public function return()
    {
        return $this->hasOne(ReturnModel::class);
    }
}

5. Model Return

Buat model untuk tabel returns dengan perintah:

php artisan make:model ReturnModel

Tambahkan fillable dan relasi belongsTo dengan Loan:

class ReturnModel extends Model
{
    protected $fillable = ['loan_id', 'returned_at'];

    public function loan()
    {
        return $this->belongsTo(Loan::class);
    }
}

Dengan langkah-langkah di atas, kita telah membuat model beserta relasi ORM untuk tabel-tabel penting dalam website perpustakaan online.

Cara Menginstal Spatie dan Mengatur Role serta Permissions

Pada tahap ini, kita akan menggunakan package Spatie Laravel Permission untuk mengelola roles dan permissions dalam proyek website perpustakaan online. Dengan package ini, kita bisa membuat role seperti admin, librarian, dan member, serta menentukan permissions untuk setiap role, misalnya mengelola buku, meminjam buku, dan mengelola anggota.

Berikut langkah-langkah instalasi dan pengaturan Spatie Permission.

1. Instalasi Spatie Laravel Permission

Langkah pertama adalah menginstal package Spatie Permission. Jalankan perintah berikut di terminal:

composer require spatie/laravel-permission

Setelah itu, publikasikan konfigurasi dan migration bawaan dari Spatie dengan perintah:

php artisan vendor:publish --provider="Spatie\\\\Permission\\\\PermissionServiceProvider"

Perintah ini akan menghasilkan file konfigurasi config/permission.php dan migration untuk tabel roles, permissions, dan model_has_roles.

Kemudian jalankan migration untuk membuat tabel yang diperlukan:

php artisan migrate

2. Mengatur Model User untuk Role dan Permission

Setelah instalasi berhasil, kita perlu menambahkan trait HasRoles ke dalam model User agar model tersebut bisa menggunakan fitur role dan permission. Buka file app/Models/User.php dan tambahkan HasRoles seperti berikut:

namespace App\\\\Models;

use Illuminate\\\\Foundation\\\\Auth\\\\User as Authenticatable;
use Spatie\\\\Permission\\\\Traits\\\\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // Properti dan method lainnya...
}

3. Membuat Role dan Permission

Setelah model siap, kita bisa membuat role seperti admin, librarian, dan member, serta beberapa permission yang terkait. Spatie menyediakan cara mudah untuk membuat role dan permission melalui seeder atau langsung melalui tinker. Pada tutorial ini, kita akan menggunakan seeder.

a. Membuat Seeder untuk Role dan Permission

Pertama, kita buat seeder untuk menambahkan role dan permission ke dalam database. Jalankan perintah berikut untuk membuat seeder:

php artisan make:seeder RolePermissionSeeder

Kemudian, buka file seeder yang baru dibuat di direktori database/seeders/RolePermissionSeeder.php dan tambahkan kode berikut untuk membuat role dan permission:

use Illuminate\\\\Database\\\\Seeder;
use Spatie\\\\Permission\\\\Models\\\\Role;
use Spatie\\\\Permission\\\\Models\\\\Permission;

class RolePermissionSeeder extends Seeder
{
    public function run()
    {
        // Membuat permission
        Permission::create(['name' => 'manage books']);
        Permission::create(['name' => 'manage members']);
        Permission::create(['name' => 'borrow books']);

        // Membuat role Admin dan memberikan semua permission
        $admin = Role::create(['name' => 'admin']);
        $admin->givePermissionTo(Permission::all());

        // Membuat role Librarian dan memberikan permission khusus
        $librarian = Role::create(['name' => 'librarian']);
        $librarian->givePermissionTo(['manage books', 'manage members']);

        // Membuat role Member dan memberikan permission peminjaman buku
        $member = Role::create(['name' => 'member']);
        $member->givePermissionTo('borrow books');
    }
}

Kode di atas akan membuat permission seperti manage books, manage members, dan borrow books, kemudian menetapkan permission tersebut ke role yang sesuai, yaitu:

  • Admin: memiliki semua permission.
  • Librarian: hanya memiliki permission untuk mengelola buku dan anggota.
  • Member: hanya memiliki permission untuk meminjam buku.

b. Menjalankan Seeder

Untuk menjalankan seeder dan menambahkan role serta permission ke dalam database, jalankan perintah:

php artisan db:seed --class=RolePermissionSeeder

4. Mengelola Role dan Permission di Controller

Setelah role dan permission dibuat, kita bisa menggunakannya dalam aplikasi, misalnya untuk membatasi akses ke fitur tertentu berdasarkan role.

a. Menambahkan Role ke Pengguna

Anda bisa menambahkan role ke pengguna dalam controller atau saat registrasi. Contoh, di controller RegisterController, tambahkan pengguna yang baru terdaftar sebagai member:

use App\\\\Models\\\\User;
use Spatie\\\\Permission\\\\Models\\\\Role;

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        // Validasi dan pembuatan user
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password),
        ]);

        // Menambahkan role "member" ke user yang baru dibuat
        $user->assignRole('member');

        // Redirect atau respons lainnya
    }
}

b. Membatasi Akses Berdasarkan Role

Untuk membatasi akses ke halaman atau fitur tertentu, kita bisa menggunakan middleware role atau permission yang disediakan oleh Spatie.

Contoh, jika ingin membatasi akses ke halaman pengelolaan buku hanya untuk admin dan librarian, tambahkan middleware di routing:

Route::middleware(['role:admin|librarian'])->group(function () {
    Route::get('/manage-books', [BookController::class, 'index'])->name('manage.books');
});

Atau, jika ingin membatasi berdasarkan permission, misalnya hanya pengguna dengan permission borrow books yang bisa meminjam buku:

Route::middleware(['permission:borrow books'])->group(function () {
    Route::post('/borrow-book', [LoanController::class, 'borrow'])->name('borrow.book');
});

5. Menampilkan Role dan Permission pada Tampilan

Untuk menampilkan role atau permission pada tampilan Blade, kita bisa menggunakan directive bawaan dari Spatie seperti @role atau @can.

Contoh, untuk menampilkan menu pengelolaan buku hanya untuk admin dan librarian:

@role('admin|librarian')
    <li><a href="{{ route('manage.books') }}">Manage Books</a></li>
@endrole

Atau, untuk menampilkan tombol pinjam buku hanya untuk pengguna yang memiliki permission borrow books:

@can('borrow books')
    <button>Pinjam Buku</button>
@endcan

Cara Membuat Blade Templates untuk CRUD Buku dan Manajemen Peminjaman Menggunakan Tailwind CDN

Pada tahap ini, kita akan membuat Blade templates untuk CRUD buku dan manajemen peminjaman di website perpustakaan online. Kita akan menggunakan Tailwind CSS CDN untuk membuat tampilan yang responsif dan modern.

1. Menambahkan Tailwind CSS CDN ke Proyek Laravel

Pertama, kita perlu menambahkan Tailwind CSS ke proyek. Buka file resources/views/layouts/app.blade.php dan tambahkan link Tailwind CDN di dalam <head>:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Perpustakaan Online</title>
    <!-- Tailwind CSS CDN -->
    <link href="<https://cdn.jsdelivr.net/npm/[email protected]/dist/tailwind.min.css>" rel="stylesheet">
</head>
<body class="bg-gray-100">
    <div class="container mx-auto p-4">
        @yield('content')
    </div>
</body>
</html>

Dengan menambahkan Tailwind CDN, kita sekarang bisa menggunakan utility classes dari Tailwind CSS di dalam template.

2. Membuat Template CRUD Buku

Untuk memudahkan pengguna dalam mengelola buku (CRUD), kita akan membuat beberapa tampilan: halaman untuk menampilkan daftar buku, menambahkan buku, mengedit buku, dan menghapus buku.

a. Halaman Menampilkan Daftar Buku

Buat file resources/views/books/index.blade.php untuk menampilkan daftar buku:

@extends('layouts.app')

@section('content')
    <h1 class="text-2xl font-bold mb-4">Daftar Buku</h1>

    <a href="{{ route('books.create') }}" class="bg-blue-500 text-white px-4 py-2 rounded-md mb-4 inline-block">Tambah Buku</a>

    <table class="min-w-full bg-white rounded-lg shadow-lg">
        <thead>
            <tr class="w-full bg-gray-200">
                <th class="py-2 px-4 text-left">Judul</th>
                <th class="py-2 px-4 text-left">Penulis</th>
                <th class="py-2 px-4 text-left">Stok</th>
                <th class="py-2 px-4 text-left">Aksi</th>
            </tr>
        </thead>
        <tbody>
            @foreach($books as $book)
                <tr class="border-b">
                    <td class="py-2 px-4">{{ $book->title }}</td>
                    <td class="py-2 px-4">{{ $book->author }}</td>
                    <td class="py-2 px-4">{{ $book->stock }}</td>
                    <td class="py-2 px-4">
                        <a href="{{ route('books.edit', $book->id) }}" class="text-blue-500">Edit</a>
                        <form action="{{ route('books.destroy', $book->id) }}" method="POST" class="inline-block">
                            @csrf
                            @method('DELETE')
                            <button type="submit" class="text-red-500 ml-2">Hapus</button>
                        </form>
                    </td>
                </tr>
            @endforeach
        </tbody>
    </table>
@endsection

Template ini menampilkan tabel yang memuat daftar buku, lengkap dengan aksi edit dan hapus untuk setiap buku.

b. Halaman Tambah Buku

Buat file resources/views/books/create.blade.php untuk menambahkan buku baru:

@extends('layouts.app')

@section('content')
    <h1 class="text-2xl font-bold mb-4">Tambah Buku</h1>

    <form action="{{ route('books.store') }}" method="POST" class="bg-white p-6 rounded-lg shadow-lg">
        @csrf
        <div class="mb-4">
            <label for="title" class="block text-gray-700">Judul Buku:</label>
            <input type="text" id="title" name="title" class="w-full p-2 border rounded-lg" required>
        </div>
        <div class="mb-4">
            <label for="author" class="block text-gray-700">Penulis:</label>
            <input type="text" id="author" name="author" class="w-full p-2 border rounded-lg" required>
        </div>
        <div class="mb-4">
            <label for="stock" class="block text-gray-700">Stok:</label>
            <input type="number" id="stock" name="stock" class="w-full p-2 border rounded-lg" required>
        </div>
        <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-md">Simpan</button>
    </form>
@endsection

Formulir ini memungkinkan admin untuk menambahkan informasi buku seperti judul, penulis, dan stok.

c. Halaman Edit Buku

Buat file resources/views/books/edit.blade.php untuk mengedit buku:

@extends('layouts.app')

@section('content')
    <h1 class="text-2xl font-bold mb-4">Edit Buku</h1>

    <form action="{{ route('books.update', $book->id) }}" method="POST" class="bg-white p-6 rounded-lg shadow-lg">
        @csrf
        @method('PUT')
        <div class="mb-4">
            <label for="title" class="block text-gray-700">Judul Buku:</label>
            <input type="text" id="title" name="title" class="w-full p-2 border rounded-lg" value="{{ $book->title }}" required>
        </div>
        <div class="mb-4">
            <label for="author" class="block text-gray-700">Penulis:</label>
            <input type="text" id="author" name="author" class="w-full p-2 border rounded-lg" value="{{ $book->author }}" required>
        </div>
        <div class="mb-4">
            <label for="stock" class="block text-gray-700">Stok:</label>
            <input type="number" id="stock" name="stock" class="w-full p-2 border rounded-lg" value="{{ $book->stock }}" required>
        </div>
        <button type="submit" class="bg-blue-500 text-white px-4 py-2 rounded-md">Simpan Perubahan</button>
    </form>
@endsection

Form ini menampilkan data buku yang bisa diubah oleh admin atau librarian.

3. Membuat Template Manajemen Peminjaman

Setelah template CRUD buku selesai, kita akan membuat template untuk manajemen peminjaman, di mana pengguna yang terdaftar dapat meminjam buku.

a. Halaman Peminjaman Buku

Buat file resources/views/loans/index.blade.php untuk menampilkan buku yang tersedia untuk dipinjam:

@extends('layouts.app')

@section('content')
    <h1 class="text-2xl font-bold mb-4">Daftar Buku yang Tersedia untuk Dipinjam</h1>

    <table class="min-w-full bg-white rounded-lg shadow-lg">
        <thead>
            <tr class="w-full bg-gray-200">
                <th class="py-2 px-4 text-left">Judul</th>
                <th class="py-2 px-4 text-left">Penulis</th>
                <th class="py-2 px-4 text-left">Stok</th>
                <th class="py-2 px-4 text-left">Aksi</th>
            </tr>
        </thead>
        <tbody>
            @foreach($books as $book)
                <tr class="border-b">
                    <td class="py-2 px-4">{{ $book->title }}</td>
                    <td class="py-2 px-4">{{ $book->author }}</td>
                    <td class="py-2 px-4">{{ $book->stock }}</td>
                    <td class="py-2 px-4">
                        @if($book->stock > 0)
                            <form action="{{ route('loans.borrow', $book->id) }}" method="POST">
                                @csrf
                                <button type="submit" class="bg-green-500 text-white px-4 py-2 rounded-md">Pinjam Buku</button>
                            </form>
                        @else
                            <span class="text-red-500">Stok Habis</span>
                        @endif
                    </td>
                </tr>
            @endforeach
        </tbody>
    </table>
@endsection

Template ini memungkinkan pengguna untuk melihat buku yang tersedia dan melakukan peminjaman jika stok masih ada.

Cara Membuat Controller untuk Manajemen Buku, Peminjaman, dan Pengembalian serta Implementasi Role dan Permission

Pada bagian ini, kita akan membuat controller untuk manajemen buku, peminjaman buku, dan pengembalian buku. Selain itu, kita akan menerapkan role dan permission yang sudah dibuat menggunakan package Spatie Laravel Permission untuk mengatur akses pengguna berdasarkan hak aksesnya (admin, librarian, dan member).

1. Membuat Controller untuk Manajemen Buku

Pertama, kita akan membuat controller untuk manajemen buku yang akan menangani CRUD (Create, Read, Update, Delete) operasi untuk tabel books.

a. Membuat BookController

Jalankan perintah berikut di terminal untuk membuat controller:

php artisan make:controller BookController

Setelah controller dibuat, buka file app/Http/Controllers/BookController.php dan tambahkan kode berikut untuk setiap operasi CRUD:

namespace App\\\\Http\\\\Controllers;

use App\\\\Models\\\\Book;
use Illuminate\\\\Http\\\\Request;

class BookController extends Controller
{
    // Constructor untuk mengatur middleware
    public function __construct()
    {
        // Hanya admin dan librarian yang bisa mengelola buku
        $this->middleware('role:admin|librarian');
    }

    // Menampilkan daftar buku
    public function index()
    {
        $books = Book::all();
        return view('books.index', compact('books'));
    }

    // Menampilkan form tambah buku
    public function create()
    {
        return view('books.create');
    }

    // Menyimpan buku baru ke database
    public function store(Request $request)
    {
        $request->validate([
            'title' => 'required',
            'author' => 'required',
            'stock' => 'required|integer|min:0',
        ]);

        Book::create($request->all());

        return redirect()->route('books.index')->with('success', 'Buku berhasil ditambahkan.');
    }

    // Menampilkan form edit buku
    public function edit(Book $book)
    {
        return view('books.edit', compact('book'));
    }

    // Mengupdate data buku di database
    public function update(Request $request, Book $book)
    {
        $request->validate([
            'title' => 'required',
            'author' => 'required',
            'stock' => 'required|integer|min:0',
        ]);

        $book->update($request->all());

        return redirect()->route('books.index')->with('success', 'Buku berhasil diperbarui.');
    }

    // Menghapus buku dari database
    public function destroy(Book $book)
    {
        $book->delete();

        return redirect()->route('books.index')->with('success', 'Buku berhasil dihapus.');
    }
}

Dalam controller ini, kita menggunakan middleware untuk membatasi akses ke fitur manajemen buku hanya untuk pengguna dengan role admin atau librarian. Setiap metode bertanggung jawab atas CRUD operasi (menampilkan, menambah, memperbarui, dan menghapus buku).

2. Membuat Controller untuk Peminjaman Buku

Selanjutnya, kita akan membuat controller untuk peminjaman buku yang memungkinkan pengguna member untuk meminjam buku.

a. Membuat LoanController

Jalankan perintah berikut untuk membuat controller:

php artisan make:controller LoanController

Setelah controller dibuat, buka file app/Http/Controllers/LoanController.php dan tambahkan kode berikut untuk manajemen peminjaman:

namespace App\\\\Http\\\\Controllers;

use App\\\\Models\\\\Book;
use App\\\\Models\\\\Loan;
use Illuminate\\\\Http\\\\Request;
use Illuminate\\\\Support\\\\Facades\\\\Auth;

class LoanController extends Controller
{
    // Constructor untuk mengatur middleware
    public function __construct()
    {
        // Hanya member yang bisa meminjam buku
        $this->middleware('role:member');
    }

    // Menampilkan daftar buku yang bisa dipinjam
    public function index()
    {
        $books = Book::where('stock', '>', 0)->get();
        return view('loans.index', compact('books'));
    }

    // Proses peminjaman buku
    public function borrow(Request $request, Book $book)
    {
        if ($book->stock > 0) {
            Loan::create([
                'book_id' => $book->id,
                'borrower_id' => Auth::user()->id,
                'loan_date' => now(),
            ]);

            // Kurangi stok buku
            $book->decrement('stock');

            return redirect()->route('loans.index')->with('success', 'Buku berhasil dipinjam.');
        }

        return redirect()->route('loans.index')->with('error', 'Stok buku habis.');
    }
}

Dalam LoanController, kita menggunakan middleware role:member untuk memastikan hanya pengguna dengan role member yang dapat meminjam buku. Metode borrow bertanggung jawab untuk mencatat peminjaman buku dan mengurangi stok buku.

3. Membuat Controller untuk Pengembalian Buku

Selanjutnya, kita akan membuat controller untuk pengembalian buku yang memungkinkan admin atau librarian untuk mencatat pengembalian buku oleh member.

a. Membuat ReturnController

Jalankan perintah berikut untuk membuat controller:

php artisan make:controller ReturnController

Buka file app/Http/Controllers/ReturnController.php dan tambahkan kode berikut untuk manajemen pengembalian:

namespace App\\\\Http\\\\Controllers;

use App\\\\Models\\\\Loan;
use App\\\\Models\\\\Book;
use Illuminate\\\\Http\\\\Request;

class ReturnController extends Controller
{
    // Constructor untuk mengatur middleware
    public function __construct()
    {
        // Hanya admin dan librarian yang bisa mengelola pengembalian
        $this->middleware('role:admin|librarian');
    }

    // Menampilkan daftar buku yang sedang dipinjam
    public function index()
    {
        $loans = Loan::whereNull('return_date')->get();
        return view('returns.index', compact('loans'));
    }

    // Proses pengembalian buku
    public function returnBook(Request $request, Loan $loan)
    {
        $loan->update([
            'return_date' => now(),
        ]);

        // Tambah kembali stok buku
        $loan->book->increment('stock');

        return redirect()->route('returns.index')->with('success', 'Buku berhasil dikembalikan.');
    }
}

Di ReturnController, kita membatasi akses dengan middleware agar hanya admin dan librarian yang bisa mencatat pengembalian buku. Metode returnBook mencatat tanggal pengembalian buku dan mengembalikan stok buku yang dipinjam.

4. Implementasi Role dan Permission dalam Routing

Untuk menghubungkan controller dengan Blade templates, kita perlu menambahkan routing yang sesuai di file routes/web.php. Pastikan routing menggunakan middleware role untuk membatasi akses sesuai role pengguna.

use App\\\\Http\\\\Controllers\\\\BookController;
use App\\\\Http\\\\Controllers\\\\LoanController;
use App\\\\Http\\\\Controllers\\\\ReturnController;

// Routing untuk manajemen buku (hanya untuk admin dan librarian)
Route::middleware(['role:admin|librarian'])->group(function () {
    Route::resource('books', BookController::class);
});

// Routing untuk peminjaman buku (hanya untuk member)
Route::middleware(['role:member'])->group(function () {
    Route::get('loans', [LoanController::class, 'index'])->name('loans.index');
    Route::post('loans/{book}/borrow', [LoanController::class, 'borrow'])->name('loans.borrow');
});

// Routing untuk pengembalian buku (hanya untuk admin dan librarian)
Route::middleware(['role:admin|librarian'])->group(function () {
    Route::get('returns', [ReturnController::class, 'index'])->name('returns.index');
    Route::post('returns/{loan}/return', [ReturnController::class, 'returnBook'])->name('returns.return');
});

Penutup

Dalam tutorial ini, kita telah membangun sebuah website perpustakaan online menggunakan Laravel 11, MySQL 8, Laravel Breeze untuk autentikasi, serta Spatie Laravel Permission untuk mengelola role dan permission pengguna. Website ini dilengkapi dengan fitur CRUD buku, peminjaman buku, dan pengembalian buku, di mana setiap pengguna memiliki akses sesuai dengan peran mereka.

  • Admin memiliki akses penuh untuk mengelola buku, anggota, serta pencatatan peminjaman dan pengembalian buku.
  • Librarian memiliki hak yang mirip dengan admin dalam hal pengelolaan buku dan manajemen peminjaman.
  • Member hanya dapat melakukan pencarian buku dan meminjam buku jika stok tersedia.

Dengan pembagian hak akses ini, pengelolaan perpustakaan menjadi lebih efektif dan aman, karena setiap pengguna hanya dapat melakukan tindakan sesuai dengan peran dan tanggung jawab mereka. Pendekatan ini tidak hanya meningkatkan keamanan, tetapi juga memperjelas alur kerja di dalam sistem perpustakaan online.

Semoga tutorial ini membantu dalam membangun aplikasi perpustakaan yang efisien dan terstruktur dengan baik!

Saran Dari Mentor

Laravel terus menjadi pilihan populer di kalangan developer karena framework ini selalu menghadirkan update menarik yang memudahkan proses pengembangan web. Dengan fitur-fitur terbaru seperti sistem otentikasi yang mudah, manajemen role dan permission yang efisien, serta komunitas yang kuat, Laravel membantu developer untuk membangun aplikasi yang aman, scalable, dan cepat.

Bagi yang ingin terus memperdalam skill Laravel atau framework lain, pantau terus website Buildwithangga. Mereka sering memberikan update kelas gratis yang berfokus pada studi kasus menarik dan praktis, disertai bimbingan dari mentor berpengalaman. Selain itu, dengan akses kelas seumur hidup, Anda bisa belajar kapan saja dan dari mana saja, memastikan Anda selalu up-to-date dengan perkembangan teknologi terbaru.

Terus tingkatkan kemampuan coding Anda bersama Buildwithangga dan raih kesempatan karier yang lebih baik di industri web development!