Membangun aplikasi web di era modern memerlukan pondasi yang kokoh. Framework modern memberikan fleksibilitas luar biasa bagi developer untuk menghadirkan fitur kompleks secara cepat tanpa mengabaikan aspek keamanan dan keandalan sistem.
Tahapan Implementasi & Walkthrough Kode
Berikut adalah langkah demi langkah teknis yang dapat Anda ikuti langsung pada codebase Anda:
Tahap 1: Penulisan Kode & Konfigurasi
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use ProtoneMedia\Splade\SpladeTable;
class PostController extends Controller
{
/**
* display all post data
*/
public function index()
{
// get all post data
$posts = Post::latest()->paginate(7);
// render view
return view('posts.index', [
'posts' => SpladeTable::for($posts)
->column('image')
->column('title')
->column('content')
->column('action')
]);
}
/**
* display form create
*/
public function create()
{
// render view
return view('posts.create');
}
/**
* insert new post data
*/
public function store(Request $request)
{
// validate request
$this->validate($request, [
'image' => 'required|image|mimes:jpeg,jpg,png',
'title' => 'required|min:5',
'content' => 'required|min:10'
]);
// upload image
$image = $request->file('image');
$image->storeAs('public/posts', $image->hashName());
// insert new post to db
Post::create([
'title' => $request->title,
'content' => $request->content,
'image' => $image->hashName(),
]);
// render view
return redirect(route('posts.index'));
}
/**
* display form edit
*/
public function edit(Post $post)
{
// render view
return view('posts.edit', [
'post' => $post
]);
}
/**
* update post data by id
*/
public function update(Post $post, Request $request)
{
// validate request
$this->validate($request, [
'image' => 'nullable|image|mimes:jpeg,jpg,png',
'title' => 'required|min:5',
'content' => 'required|min:10'
]);
// update post data by id
$post->update([
'title' => $request->title,
'content' => $request->content,
]);
// check if user upload new image
if($request->file('image')){
// upload image
$image = $request->file('image');
$image->storeAs('public/posts', $image->hashName());
// delete old image
Storage::delete('public/posts/'. $post->image);
// update post data image
$post->update([
'image' => $image->hashName(),
]);
}
// render view
return redirect(route('posts.index'));
}
}
Tahap 2: Penulisan Kode & Konfigurasi
use Illuminate\Support\Facades\Storage;
Tahap 3: Penulisan Kode & Konfigurasi
/**
* display form edit
*/
public function edit(Post $post)
{
// masukan kode disini...
}
Tahap 4: Penulisan Kode & Konfigurasi
// render view
return view('posts.edit', [
'post' => $post
]);
Tahap 5: Penulisan Kode & Konfigurasi
/**
* update post data by id
*/
public function store(Post $post, Request $request)
{
// masukan kode disini...
}
Tahap 6: Penulisan Kode & Konfigurasi
// validate request
$this->validate($request, [
'image' => 'nullable|image|mimes:jpeg,jpg,png',
'title' => 'required|min:5',
'content' => 'required|min:10'
]);
Tahap 7: Penulisan Kode & Konfigurasi
// update post data by id
$post->update([
'title' => $request->title,
'content' => $request->content,
]);
Tahap 8: Penulisan Kode & Konfigurasi
// check if user upload new image
if($request->file('image')){
// upload image
$image = $request->file('image');
$image->storeAs('public/posts', $image->hashName());
// delete old image
Storage::delete('public/posts/'. $post->image);
// update post data image
$post->update([
'image' => $image->hashName(),
]);
}
Tahap 9: Penulisan Kode & Konfigurasi
Storage::delete('public/posts/'. $post->image);
Tahap 10: Penulisan Kode & Konfigurasi
// update post data image
$post->update([
'image' => $image->hashName(),
]);
Tahap 11: Penulisan Kode & Konfigurasi
// render view
return redirect(route('posts.index'));
Tahap 12: Penulisan Kode & Konfigurasi
<x-layout>
<x-slot name="header">
{{ __('Posts Edit') }}
</x-slot>
<x-panel>
<x-splade-form :default="['title' => $post->title, 'content' => $post->content]" :action="route('posts.update', $post->id)" class="flex flex-col gap-4" method="put">
<div class="flex gap-4">
{{-- form input --}}
<div class="w-1/2 flex flex-col gap-4">
<div class="border-b p-2">
<h1 class="text-lg text-gray-700 font-semibold">UPDATE POST</h1>
</div>
<x-splade-file name="image" :show-filename="true" label="Image" />
<x-splade-input name="title" type="text" label="Title" placeholder="Input your title post" />
<x-splade-textarea name="content" autosize label="Content" />
<div class="flex gap-2 items-center">
<button type="submit"
class="bg-gray-700 p-2 text-white rounded-md text-sm flex items-center gap-1 hover:bg-gray-800">
<svg xmlns="http://www.w3.org/2000/svg"
class="icon icon-tabler icon-tabler-device-floppy w-4 h-4" width="24" height="24"
viewBox="0 0 24 24" stroke-width="1.2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M6 4h10l4 4v10a2 2 0 0 1 -2 2h-12a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2"></path>
<path d="M12 14m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0"></path>
<path d="M14 4l0 4l-6 0l0 -4"></path>
</svg>
Update
</button>
<Link href="/posts"
class="bg-rose-700 p-2 text-white rounded-md text-sm flex items-center gap-1 hover:bg-rose-800">
<svg xmlns="http://www.w3.org/2000/svg"
class="icon icon-tabler icon-tabler-arrow-narrow-left w-4 h-4" width="24" height="24"
viewBox="0 0 24 24" stroke-width="1.2" stroke="currentColor" fill="none"
stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M5 12l14 0"></path>
<path d="M5 12l4 4"></path>
<path d="M5 12l4 -4"></path>
</svg>
Back
</Link>
</div>
</div>
{{-- preview image --}}
<div class="w-1/2">
<div class="flex flex-col gap-4" v-if="form.image">
<div class="border-b p-2">
<h1 class="text-lg text-gray-700 font-semibold">PREVIEW IMAGE</h1>
</div>
<img v-if="form.image" :src="form.$fileAsUrl('image')" class="rounded-md" />
</div>
</div>
</div>
</x-splade-form>
</x-panel>
</x-layout>
Tahap 13: Penulisan Kode & Konfigurasi
<x-layout>
// masukan kode disini...
</x-layout>
Tahap 14: Penulisan Kode & Konfigurasi
<x-slot name="header">
{{ __('Posts Update') }}
</x-slot>
Tahap 15: Penulisan Kode & Konfigurasi
<x-splade-form :default="['title' => $post->title, 'content' => $post->content]" :action="route('posts.update', $post->id)" class="flex flex-col gap-4" method="put>
// masukan kode disini...
</x-splade-form>
Tahap 16: Penulisan Kode & Konfigurasi
<x-splade-file/>
Tahap 17: Penulisan Kode & Konfigurasi
<x-spade-input/>
Tahap 18: Penulisan Kode & Konfigurasi
<x-splade-textarea/>
Selalu gunakan pendekatan deklaratif, validasi input seawal mungkin di boundary layer, dan lakukan logging terstruktur untuk memudahkan observability ketika sistem dijalankan di lingkungan cloud produksi.
Kesimpulan
Dengan mengikuti langkah-langkah terstruktur di atas, implementasi modul Anda akan jauh lebih rapi, aman dari bug umum, serta siap diskalakan ke lingkungan produksi.
Nantikan artikel tutorial praktis lainnya seputar fullstack development, microservices, dan otomasi AI di Blog Engineering SiHubung. Selamat mencoba!