CRUD Manajemen Artikel - Refaktor Form Tambah dan Ubah Artikel
8 Maret 2025
·
6 menit · 4 kali baca

Setelah sebelumnya kita berhasil membuat fitur menambah dan mengubah artikel, kini saatnya kita melakukan sedikit refaktor agar kode menjadi lebih rapi, efisien, dan mudah dikelola.
Pada artikel ini, kita akan menyatukan form tambah dan edit artikel ke dalam satu tampilan yang fleksibel. Selain itu, kita juga akan mengelola beberapa variabel umum langsung dari constructor agar tidak perlu dimuat pada masing-masing method controller.
Yuk, langsung kita mulai dengan menyatukan form-nya!
Menyatukan Form
Terdapat banyak kesamaan antara file View create.blade.php dan edit.blade.php. Untuk mengurangi duplikasi kode dan membuat kode jadi lebih mudah dipelihara, kita dapat membuat kode View form ini jadi lebih sederhana.
Kita akan menggabungkan kedua file View form menjadi satu file view saja, yaitu file edit.blade.php seperti berikut:

Untuk menggabungkan, kita mempertahankan kode yang sama dari kedua view dan membuat kondisi percabangan (if / else) pada bagian yang berbeda.
Mungkin muncul pertanyaan, “Bagaimana cara membedakan antara Create dan Edit? Apakah terdapat kondisi penentu atau pembeda antara keduanya?”
Pertanyaan bagus! Jawabannya: kita bisa cek model $article
!
Untuk membedakan mode Create dan Edit, kita cukup memeriksa apakah model $article
memiliki ID. Berikut perbandingannya:
Kondisi | Nilai $article->id |
---|---|
Create | null — Model Article belum memiliki nilai id karena data belum tersimpan pada database. |
Edit | Ada nilai id karena data sudah tersimpan pada database. |
Agar lebih jelas, mari sesuaikan Controller menjadi seperti berikut:
📄 app/Http/Controllers/ArticleController.php
|
|
- Baris 8
Membuat instance baru dari modelArticle
. - Baris 12
- Menggunakan View edit.blade.php, bukan create.blade.php.
- Menambahkan argumen
article
ke dalamcompact
untuk mengirimkan model$article
yang baru dibuat ke View.
Selanjutnya, sesuaikan file View form menjadi:
📄 resources/views/pages/articles/edit.blade.php
|
|
- Baris 1-3
Membuat sebuah flag$isEditMode
untuk membedakan Create atau Edit berdasarkan ada/tidaknya ID. Nilai$article->id
bernilainull
(falsy) pada kondisi Create dan bernilai3
/25
/41
sesuai ID artikel (truthy) pada kondisi Edit. - Baris 7
Menyesuaikan judul halaman. - Baris 11
Menyesuaikan method dan action form. - Baris 12
Memungkinkan semua input form otomatis terisi dengan nilai dari model$article
saat mode Edit. - Baris 84
Menyesuaikan nilai default fieldstatus
saat Edit. - Baris 94
Menyesuaikan nilai default fieldpublished_at
saat Edit. - Baris 103
Menyesuaikan teks pada tombol submit.
Mengelola Beberapa Variabel Umum Langsung dari Constructor
Variabel $statusList
pada Method create()
dan edit()
Pada file controller, tambahkan properti
$statusList
dan isi method constructor sebagai berikut:1 2 3 4 5 6 7 8 9 10 11 12
/** ... **/ class ArticleController extends Controller { private array $statusList; public function __construct() { $this->statusList = Article::STATUS_LIST; } /** ... **/
Sesuaikan method
create()
danedit()
menjadi sebagai berikut:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/** ... **/ public function create(): View { $article = new Article; return view('pages.articles.edit', [ ...compact('article'), 'statusList' => $this->statusList, ]); } /** ... **/ public function edit(Article $article): View { return view('pages.articles.edit', [ ...compact('article'), 'statusList' => $this->statusList, ]); } /** ... **/
Variabel $storagePath
pada Method store()
dan update()
Pada file controller, tambahkan properti
$storagePath
dan isi method constructor sebagai berikut:1 2 3 4 5 6 7 8 9 10 11 12 13 14
/** ... **/ class ArticleController extends Controller { private array $statusList; private string $storagePath; public function __construct() { $this->statusList = Article::STATUS_LIST; $this->storagePath = Article::IMAGE_STORAGE_PATH; } /** ... **/
Sesuaikan method
store()
danupdate()
menjadi sebagai berikut:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
/** ... **/ public function store(ArticleRequest $request): RedirectResponse { /** ... **/ $file->storeAs($this->storagePath, $fileName, 'public'); /** ... **/ } /** ... **/ public function update(ArticleRequest $request, Article $article): RedirectResponse { try { $input = $request->validated(); if ($request->hasFile('feature_image_url')) { if ($article->feature_image_url) { $oldFilePath = "$this->storagePath/$article->feature_image_url"; if (Storage::disk('public')->exists($oldFilePath)) { Storage::disk('public')->delete($oldFilePath); } } /** ... **/ $file->storeAs($this->storagePath, $fileName, 'public'); /** ... **/ } /** ... **/
Hasil Refaktor
Apabila kita melihat lagi tampilan Create & Edit, kita akan melihat bahwa View dapat berfungsi dengan baik pada kondisi Create maupun Edit seperti semula:
Kondisi Create

Kondisi Edit

Apabila sebelumnya kita memiliki dua file View, …

… kini hanya tersisa satu saja.

Dengan ini, jika kita ingin mengubah form, cukup ubah di satu file saja. Tidak perlu lagi mengubah di dua tempat yang berbeda. Kode jadi lebih rapi dan mudah dipelihara!
Dengan pendekatan ini, kita tidak hanya membuat kode menjadi lebih DRY (Don’t Repeat Yourself), tetapi juga meningkatkan konsistensi tampilan dan pengalaman user secara keseluruhan. Jauh lebih rapi dan tentu lebih menyenangkan untuk dikelola ke depannya!
Pada artikel berikutnya, kita akan membahas fitur delete untuk menyempurnakan proses CRUD. Semangat terus, yaa! ✨