Press ESC to close

Implementasi Create Data di Laravel 11: Membuat Form dan Validasi (Panduan Lengkap) – CRUD #2

Pendahuluan

Setelah berhasil melakukan setup dasar di artikel sebelumnya, kini kita akan mempelajari cara mengimplementasikan fungsi Create untuk menambah data produk. Tutorial ini akan mencakup pembuatan controller, form input, dan validasi data.

Langkah 1: Membuat Controller

  1. Buat ProductController dengan perintah artisan:
php artisan make:controller ProductController --resource
  1. Edit file app/Http/Controllers/ProductController.php:
namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    public function index()
    {
        $products = Product::latest()->paginate(10);
        return view('products.index', compact('products'));
    }

    public function create()
    {
        return view('products.create');
    }

    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required|max:255',
            'description' => 'required',
            'price' => 'required|numeric|min:0',
            'stock' => 'required|integer|min:0'
        ]);

        Product::create($request->all());

        return redirect()->route('products.index')
            ->with('success', 'Produk berhasil ditambahkan!');
    }
}

Langkah 2: Menambahkan Routes

Buka file routes/web.php dan tambahkan route berikut:

use App\Http\Controllers\ProductController;

Route::resource('products', ProductController::class);

Langkah 3: Membuat Views

  1. Buat folder resources/views/products
  2. Buat file resources/views/products/create.blade.php:
@extends('layouts.app')

@section('content')
<div class="container mx-auto px-4 py-8">
    <div class="max-w-2xl mx-auto">
        <h1 class="text-2xl font-bold mb-6">Tambah Produk Baru</h1>

        @if ($errors->any())
        <div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded mb-4">
            <ul>
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
        @endif

        <form action="{{ route('products.store') }}" method="POST">
            @csrf
            <div class="mb-4">
                <label class="block text-gray-700 font-bold mb-2" for="name">
                    Nama Produk
                </label>
                <input type="text" 
                       name="name" 
                       id="name" 
                       value="{{ old('name') }}"
                       class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
                       required>
            </div>

            <div class="mb-4">
                <label class="block text-gray-700 font-bold mb-2" for="description">
                    Deskripsi
                </label>
                <textarea name="description" 
                          id="description"
                          class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
                          rows="4"
                          required>{{ old('description') }}</textarea>
            </div>

            <div class="mb-4">
                <label class="block text-gray-700 font-bold mb-2" for="price">
                    Harga
                </label>
                <input type="number" 
                       name="price" 
                       id="price"
                       value="{{ old('price') }}"
                       class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
                       step="0.01"
                       required>
            </div>

            <div class="mb-6">
                <label class="block text-gray-700 font-bold mb-2" for="stock">
                    Stok
                </label>
                <input type="number" 
                       name="stock" 
                       id="stock"
                       value="{{ old('stock') }}"
                       class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline"
                       required>
            </div>

            <div class="flex items-center justify-between">
                <button type="submit" 
                        class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">
                    Simpan Produk
                </button>
                <a href="{{ route('products.index') }}" 
                   class="text-gray-600 hover:text-gray-800">
                    Kembali
                </a>
            </div>
        </form>
    </div>
</div>
@endsection
  1. Buat file resources/views/layouts/app.blade.php:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CRUD Laravel 11</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100">
    <nav class="bg-white shadow-lg mb-8">
        <div class="container mx-auto px-4">
            <div class="flex justify-between h-16">
                <div class="flex items-center">
                    <a href="{{ route('products.index') }}" class="font-bold text-xl">
                        Laravel CRUD
                    </a>
                </div>
            </div>
        </div>
    </nav>

    @yield('content')
</body>
</html>

Langkah 4: Menambahkan Flash Messages

  1. Buat file resources/views/components/flash-message.blade.php:
@if ($message = Session::get('success'))
<div class="bg-green-100 border border-green-400 text-green-700 px-4 py-3 rounded mb-4">
    <strong>{{ $message }}</strong>
</div>
@endif
  1. Update layouts/app.blade.php untuk menampilkan flash message:
<!-- Tambahkan setelah nav dan sebelum @yield('content') -->
<div class="container mx-auto px-4">
    @include('components.flash-message')
</div>

Langkah 5: Pengujian Create Data

  1. Jalankan server Laravel:
php artisan serve
  1. Buka browser dan akses:
http://localhost:8000/products/create

Best Practices dan Tips

1. Validasi Data

  • Selalu validasi input user di server-side
  • Gunakan rules yang sesuai dengan kebutuhan
  • Tambahkan validasi custom jika diperlukan

2. Security

  • Pastikan CSRF token ada di setiap form
  • Gunakan mass assignment protection dengan $fillable
  • Sanitasi input sebelum disimpan ke database

  1. User Experience
  • Tampilkan pesan error yang jelas
  • Pertahankan nilai input setelah validasi gagal
  • Berikan feedback setelah operasi berhasil

Kesimpulan

Sekarang Anda telah berhasil mengimplementasikan fungsi Create di Laravel 11. Form yang dibuat sudah dilengkapi dengan validasi dan feedback untuk user.

Leave a Reply

Your email address will not be published. Required fields are marked *