Di setiap CMS Blog, tidak bisa dipungkiri pasti ada tag untuk halaman article atau post. Sama seperti pada tutorial sebelumnya, tentang membuat modul Kategori di CMS Laravel, kali ini kita akan membuat modul tag di halaman admin (CRUD).

1. Membuat Tabel dan Model untuk Tag

Kita akan mulai dengan membuat model dan migrasi untuk tabel  tags menggunakan perintah Artisan.

php artisan make:model Tag -m

Buka file migrasi yang telah dibuat di folder database/migrations. Di dalam file migrasi create_tags_table.php, tambahkan kolom yang diperlukan:

public function up()
{
    Schema::create('tags', function (Blueprint $table) {
        $table->id();
        $table->string('name')->unique();
        $table->string('slug')->unique();
        $table->timestamps();
    });
}

Lalu jalankan migrasi ini:

php artisan migrate

2. Membuat Model Tag

Buka file model Tag.php di folder app/Models. Tambahkan pengaturan berikut:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    use HasFactory;

    protected $fillable = ['name', 'slug'];
}

3. Membuat Controller TagController

Buat controller TagController dengan command:

php artisan make:controller TagController --resource

Buka app/Http/Controllers/TagController.php dan tambahkan kode berikut untuk CRUD Tag:

<?php

namespace App\Http\Controllers;

use App\Models\Tag;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

class TagController extends Controller
{
    public function index()
    {
        $tags = Tag::all();
        return view('admin.tags.index', compact('tags'));
    }

    public function create()
    {
        return view('admin.tags.create');
    }

    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required|unique:tags,name',
        ]);

        Tag::create([
            'name' => $request->name,
            'slug' => Str::slug($request->name),
        ]);

        return redirect()->route('tags.index')->with('success', 'Tag created successfully');
    }

    public function edit(Tag $tag)
    {
        return view('admin.tags.edit', compact('tag'));
    }

    public function update(Request $request, Tag $tag)
    {
        $request->validate([
            'name' => 'required|unique:tags,name,' . $tag->id,
        ]);

        $tag->update([
            'name' => $request->name,
            'slug' => Str::slug($request->name),
        ]);

        return redirect()->route('tags.index')->with('success', 'Tag updated successfully');
    }

    public function destroy(Tag $tag)
    {
        $tag->delete();
        return redirect()->route('tags.index')->with('success', 'Tag deleted successfully');
    }
}

4. Routes untuk Tag CRUD

Tambahkan route CRUD untuk Tag di routes/web.php:

use App\Http\Controllers\TagController;

Route::resource('tags', TagController::class);

5. Views untuk CRUD Tag

Buat folder tags di dalam resources/views/admin/ untuk menyimpan tampilan CRUD Tag.

Buat index.blade.php untuk menampilkan daftar tag dan isi sebagai berikut:

@extends('layouts.admin')

@section('content')
<div class="container mt-4">
    <h2>Tag List</h2>
    <a href="{{ route('tags.create') }}" class="btn btn-primary mb-3">Add New Tag</a>

    @if(session('success'))
        <div class="alert alert-success">{{ session('success') }}</div>
    @endif

    <table class="table table-bordered">
        <thead>
            <tr>
                <th>#</th>
                <th>Name</th>
                <th>Slug</th>
                <th>Actions</th>
            </tr>
        </thead>
        <tbody>
            @foreach($tags as $tag)
                <tr>
                    <td>{{ $loop->iteration }}</td>
                    <td>{{ $tag->name }}</td>
                    <td>{{ $tag->slug }}</td>
                    <td>
                        <a href="{{ route('tags.edit', $tag) }}" class="btn btn-warning btn-sm">Edit</a>
                        <form action="{{ route('tags.destroy', $tag) }}" method="POST" style="display:inline-block;">
                            @csrf
                            @method('DELETE')
                            <button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Are you sure?')">Delete</button>
                        </form>
                    </td>
                </tr>
            @endforeach
        </tbody>
    </table>
</div>
@endsection

Buat create.blade.php untuk menambahkan tag baru.

@extends('layouts.admin')

@section('content')
<div class="container mt-4">
    <h2>Create Tag</h2>
    <form action="{{ route('tags.store') }}" method="POST">
        @csrf
        <div class="form-group mb-3">
            <label for="name">Tag Name</label>
            <input type="text" name="name" class="form-control" id="name" required>
        </div>
        <button type="submit" class="btn btn-primary">Save</button>
        <a href="{{ route('tags.index') }}" class="btn btn-secondary">Back</a>
    </form>
</div>
@endsection

Buat file edit.blade.php di foler yang sama untuk mengedit tag.

@extends('layouts.admin')

@section('content')
<div class="container mt-4">
    <h2>Edit Tag</h2>
    <form action="{{ route('tags.update', $tag) }}" method="POST">
        @csrf
        @method('PUT')
        <div class="form-group mb-3">
            <label for="name">Tag Name</label>
            <input type="text" name="name" class="form-control" id="name" value="{{ $tag->name }}" required>
        </div>
        <button type="submit" class="btn btn-primary">Update</button>
        <a href="{{ route('tags.index') }}" class="btn btn-secondary">Back</a>
    </form>
</div>
@endsection

Testing CRUD Tag

Tambahkan link navigasi di sidebar dengan menambah code berikut di file admins/layout.blade.php:

<a class="nav-link {{ request()->is('tags*') ? 'active' : '' }}" href="{{ route('tags.index') }}">
        <i class="fa fa-tag"></i> Tags
</a>

Setelah itu, kita akan testing CRUD dengan akses http://localhost:8000/admin/tags, hasilnya seperti berikut: