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: