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 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'));
}
}
Tahap 2: Penulisan Kode & Konfigurasi
/**
* display form create
*/
public function create()
{
// masukan kode disini...
}
Tahap 3: Penulisan Kode & Konfigurasi
// render view
return view('posts.create');
Tahap 4: Penulisan Kode & Konfigurasi
/**
* insert new post data
*/
public function store(Request $request)
{
// masukan kode disini...
}
Tahap 5: Penulisan Kode & Konfigurasi
// validate request
$this->validate($request, [
'image' => 'required|image|mimes:jpeg,jpg,png',
'title' => 'required|min:5',
'content' => 'required|min:10'
]);
Tahap 6: Penulisan Kode & Konfigurasi
// upload image
$image = $request->file('image');
$image->storeAs('public/posts', $image->hashName());
Tahap 7: Penulisan Kode & Konfigurasi
// inser new post to db
Post::create([
'title' => $request->title,
'content' => $request->content,
'image' => $image->hashName(),
]);
Tahap 8: Penulisan Kode & Konfigurasi
// render view
return redirect(route('posts.index'));
Tahap 9: Penulisan Kode & Konfigurasi
<x-layout>
<x-slot name="header">
{{ __('Posts Create') }}
</x-slot>
<x-panel>
<x-splade-form action="/posts" class="flex flex-col gap-4" enctype='multipart/form-data'>
<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">CREATE NEW 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>
Save
</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 10: Penulisan Kode & Konfigurasi
<x-layout>
// masukan kode disini...
</x-layout>
Tahap 11: Penulisan Kode & Konfigurasi
<x-slot name="header">
{{ __('Posts Create') }}
</x-slot>
Tahap 12: Penulisan Kode & Konfigurasi
<x-splade-form action="/posts" class="flex flex-col gap-4">
// masukan kode disini...
</x-splade-form>
Tahap 13: Penulisan Kode & Konfigurasi
<x-splade-file/>
Tahap 14: Penulisan Kode & Konfigurasi
<x-spade-input/>
Tahap 15: 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!