CRUD Laravel 9 #3: Insert Data ke Database dan Implementasi Form Request Validation
CRUD Laravel 9 - Pada artikel sebelumnya, saya telah membagikan bagaimana mengatur layout di laravel 9 dan memang kita masih belum mempunyai data, sehingga data belum bisa ditampilkan. Dan pada artikel kali ini, saya akan membagikan cara bagaimana melakukan insert data ke database di laravel 9.
Di artikel ini, saya juga akan mengimplementasikan penggunaan form request validation, flash message dan upload image. Baiklah, mari kita langsung saja ke koding. 👨💻 🚀
Step 1: Implementasi Form Request
php artisan make:Request PostRequest Pada step yang pertama ini, saya akan mengajak kalian untuk membuat form request validation. Bagaimana caranya? cukup mudah, silahkan jalankan perintah artisan seperti di atas, maka perintah tersebut akan melakukan generate file dengan nama PostRequest dan diletakkan pada direktori app/Request.
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class PostRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'cover' => request()->isMethod('post') ? 'required|image|mimes:png,jpg,jpeg,gif|max:2048' : 'image|mimes:png,jpg,jpeg,gif|max:2048',
'title' => 'required|max:255|unique:posts,title,'.optional($this->post)->id,
'content' => 'required',
];
}
public function message()
{
return [
'cover.required' => 'Cover is required',
'cover.mimes' => 'Cover must be an image',
'cover.max' => 'Cover must be less than 2MB',
'title.required' => 'Title is required',
'title.max' => 'Title must be less than 255 characters',
'title.unique' => 'Title must be unique',
'content.required' => 'Content is required',
];
}
} Selanjutnya, buka file PostRequest yang baru saja digenerate tersebut dan sesuaikan kodenya menjadi seperti kode di atas. Perhatikan pada method rules, terdapat ternary operator pada bagian cover, ternary operator tersebut maksudnya adalah ketika method yang aktif pada halaman tersebut merupakan POST, maka cover required atau wajib diisi, namun jika method yang aktif pada halaman tersebut bukan POST atau bisa juga PUT, maka cover nullable. Disini kamu juga bisa mengubah pesan error pada method message().
Step 2: Setup Layout
form.blade.php
<div class="mb-3">
<label for="cover" class="form-label">Cover</label>
@isset($post->cover)
<br>
<img src="{{ asset('storage/'.$post->cover) }}" alt="cover" class="rounded-3 mb-2" height="250" width="auto">
@endisset
<input type="file" name="cover" class="form-control @error('cover') is-invalid @enderror" id="cover">
@error('cover')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label for="title" class="form-label">Title</label>
<input type="text" name="title" class="form-control @error('title') is-invalid @enderror" id="title" value="{{ old('title') ?? $post->title }}" placeholder="Title">
@error('title')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label for="content" class="form-label">Content</label>
<textarea class="form-control" name="content" id="content" rows="3">{{ old('content') ?? $post->content }}</textarea>
@error('content')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<button type="submit" class="btn btn-primary">{{ $label }}</button> Lanjut ke layout. Disini kita bisa menggunakan file partial yang artinya, file ini dapat kita gunakan di file view yang lainnya. Contohnya; silahkan buat file view baru dengan nama form.blade.php di dalam direktori resources/views/posts, kemudian copy code di atas dan paste di file form.blade.php yang baru saja dibuat tersebut. Nantinya, code ini akan kita gunakan pada create.blade.php dan edit.blade.php.
@isset($post->cover)
<br>
<img src="{{ asset('storage/'.$post->cover) }}" alt="cover" class="rounded-3 mb-2" height="250" width="auto">
@endisset Perhatikan, pada code form.blade.php tersebut terdapat code seperti di atas. Jadi dengan code tersebut, kita akan menampilkan image saat kita edit data atau jika data tersebut mempunyai value cover.
create.blade.php
@extends('layouts.app')
@section('content')
<form action="{{ route('posts.store') }}" method="post" enctype="multipart/form-data">
@csrf
@include('posts.form')
</form>
@endsection Lanjut ke file view lainnya, silahkan buat file view baru lagi dengan nama create.blade.php dan tentunya juga di dalam direktori resources/views/posts. Kemudian, copy code di atas dan paste di file create.blade.php yang baru saja dibuat tersebut. Seperti apa yang saya katakan sebelumnya, kita akan menggunakan form.blade.php pada file create.blade.php. Karena kita juga akan menerapkan upload file, maka jangan lupa untuk menambahkan attribute enctype="multipart/form-data".
Flash Message (index.blade.php)
@if (session('success'))
<div class="alert alert-success alert-dismissible fade show" role="alert">
{{ session('success') }}
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
@endif Oke, untuk mempercantikan tampilan, kita tambahkan flash message. Jadi, flash message ini akan ditampilkan jika terdapat session success. Copy code di atas, lalu paste di file index.blade.php atau tepat di atas <table> tag.
Step 3: Setup Controller
public function create()
{
return view('posts.create',[
'label'=> 'Create',
'post' => new Post()
]);
}
public function store(PostRequest $request)
{
$cover = $request->file('cover');
$fileName = time().'_'.$cover->getClientOriginalName();
$cover = $cover->storeAs('images/posts', $fileName, 'public');
Post::create([
'cover' => $cover,
'title' => str($request->title)->title(), //or Str::of($request->title)->title() or Str::title($request->title)
'slug' => str($request->title)->slug(), //or Str::of($request->title)->slug('-') or Str::slug($request->title)
'content' => $request->content,
]);
return to_route('posts.index')->with('success','Post created successfully');
} Lanjut ke PostController.php, disini kita akan bekerja pada method create dan store. Pada method create, arahkan ke file view create.blade.php berserta variable data label dan post. variabel label ini merupakan teks yang akan ditampilan pada button submit di form.blade.php, karena ini merupakan method create() jadi kita bisa atur teksnya menjadi "Create". Dan untuk variabel post, sebenarnya ini hanyalah formalitas saja. Kita memerlukan variable post di method create(), agar tidak terjadi error saat kita membuka halaman create, karena pada form.blade.php kita menggunakan variabel $post.
Nah, pada method store(), saya akan memperkenalkan hal baru yang ada di laravel 9 yaitu str() dan to_route() helper functions. Jadi alurnya, saat ada request cover maka file tersebut akan diupload ke direktori storage/app/public/images/posts dengan nama {time}_nama_asli_file_tersebut.
Kemudian untuk title, kita akan mengambil dari request title dan meng-konversinya menjadi title case. Jadi, misal request yang dikirim adalah "lorem iPsum", maka data yang akan diinsert ke database adalah "Lorem Ipsum". Sebelumnya pada laravel versi 8 ke bawah, untuk konversi string menjadi Title Case seperti ini, kita bisa menggunakan helper functions Str::of($request->title)->title() atau Str::title($request->title).
Untuk slug, kita akan mengambil data dari request title dan meng-konversinya menjadi slug dengan str($request->title)->slug(). Pada laravel versi 8 ke bawah sebelumnya, jika kita ingin membuat slug, kita dapat menggunakan helper function Str::of($request->title)->slug('-') atau Str::slug($request->title).
Setelah data tersimpan, kita akan mengarahkannya kembali ke route posts.index menggunakan to_route helper function beserta success session dengan message "Post created successfully". Pada laravel versi 8 ke bawah, jika kita ingin me-return ke route dengan parameter route name, kita dapat menggunakan redirect()->route('route.name').
Step 4: Generate Storage:link
php artisan storage:link Karena kita mengunggah file atau image di dalam direktori storage, maka jika kita ingin mengambil atau menampilkannya, kita perlu membuat atau generate link dari storage di direktori public. Silahkan jalankan perintah artisan seperti di atas untuk melakukan generate storage link.
Step 5: Testing
Well, setelah melalui langkah-langkah yang telah saya tulis di artikel ini, mulai dari membuat form request validation, setup layout, controller sampai pada langkah generate storage link, dan sekarang adalah waktunya testing. Silahkan jalankan laravel project kalian dengan perintah php artisan serve, lalu buka pada browser kalian dengan URL 127.0.0.1:{port}/posts atau crud-laravel9.test/posts. Kemudian, klik create button dan isi semua input field yang tersedia di halaman create.
Gambar di atas merupakan tampilan halaman posts index jika sudah terdapat data pada table posts. Disini kita belum mempunya actions button, karena kita akan membuatnya pada artikel selanjutnya. 🚀
- Tutorial CRUD (Create, Read, Update and Delete) Laravel 9
- CRUD Laravel 9 #2: Set up Layout dan Menampilkan Data dari Database
- CRUD Laravel 9 #3: Insert Data ke Database dan Implementasi Form Request Validation
- CRUD Laravel 9 #4: Edit & Update Data dari Database
- CRUD Laravel 9 #5: Delete Data dari Database & Implementasi Sweetalert2
- CRUD Laravel 9 #6: Implementasi Softdelete
- CRUD Laravel 9 #7: Membuat Fitur Pencarian dengan Laravel Scout Database Driver
Last updated on June 03, 2026