laravelvalidasiformMenengah3 mnt baca

Validasi dengan Form Request

Validasi input dengan elegan: rules, pesan kustom, dan class Form Request yang reusable.

Validasi cepat di controller

Cara paling ringkas untuk validasi sederhana:

php
// app/Http/Controllers/PostController.php
public function store(Request $request)
{
    $validated = $request->validate([
        'judul' => 'required|string|max:255',
        'slug' => 'required|string|unique:posts,slug',
        'isi' => 'required|string|min:50',
        'status' => 'required|in:draft,published',
    ]);

    Post::create($validated);

    return redirect()->route('posts.index')
        ->with('sukses', 'Postingan berhasil dibuat!');
}

Kalau validasi gagal, Laravel otomatis redirect kembali ke form dengan error dan input lama. Di Blade tampilkan dengan @error:

blade
<input name="judul" value="{{ old('judul') }}">
@error('judul')
    <p class="error">{{ $message }}</p>
@enderror

Form Request: validasi yang reusable

Kalau rules dipakai di store dan update, atau butuh otorisasi, pindahkan ke class khusus:

bash
php artisan make:request StorePostRequest
php
// app/Http/Requests/StorePostRequest.php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StorePostRequest extends FormRequest
{
    public function authorize(): bool
    {
        return $this->user()->can('create', Post::class);
    }

    public function rules(): array
    {
        return [
            'judul' => 'required|string|max:255',
            'slug' => 'required|string|unique:posts,slug',
            'isi' => 'required|string|min:50',
            'status' => 'required|in:draft,published',
        ];
    }

    public function messages(): array
    {
        return [
            'judul.required' => 'Judul wajib diisi ya.',
            'isi.min' => 'Isi minimal 50 karakter, jangan pelit nulis.',
        ];
    }
}

Controller jadi bersih:

php
public function store(StorePostRequest $request)
{
    // Sudah tervalidasi dan terotorisasi otomatis
    Post::create($request->validated());
    return redirect()->route('posts.index');
}

Catatan teknis: $request->validated() hanya mengembalikan field yang ada di rules. Ini sekaligus proteksi mass assignment: field iseng yang dikirim user tapi tidak ada di rules otomatis dibuang. Makanya selalu pakai validated(), bukan all(), saat create atau update.