Laravel ile Form Request Validation İşlemi

Merhaba,

Laravel ile form validation işlemleri çeşitli şekillerde yapılabilir. Ama benim en çok hoşuma giden ise Form Request yöntemi oldu.

Öğrendiklerimi not edeyim. Belki başkasının da işine yarayabilir.

Diyelim ki Categories adında bir tablomuz var.

Tablomuzun sütunları ise name ve slug değerlerinden oluşmakta.

Hadi başlayalım. Öncelikle form request oluşturmalıyız.

php artisan make:request CategoryRequest

Yukarıdaki komut, app/Http/Requests altında CategoryRequest.php adında bir dosya oluşturur.

İçini açıp bakarsanız aşağıdaki gibi olduğunu görürsünüz.

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CategoryRequest extends FormRequest
{

    public function authorize()
    {
        return false;
    }

    public function rules()
    {
         return [
          
         ];
    }

  
}

 

Burada ilk olarak yapmamız gereken kısım, authorize() fonksiyonu içindeki değeri true olarak değiştirmek.

    public function authorize()
    {
        return true;
    }

 

Ardından tüm kurallarımızı rules() fonksiyonunun içine yazıyoruz. Benim form alanımda sadece name alanı var.

    public function rules()
    {
        return [
            'name' => 'required|min:2|unique:categories'
        ];

    
    }

Yukarıda diyorum ki, name alanı gerekli, minimum 2 karakterden oluşmalı ve unique olmalıdır.

İstersek  kullanıcıya göstereceğimiz mesajları da burada belirleyebiliriz. Bunun için hemen alta messages() adında bir metot tanımlıyoruz.

  public function messages()
    {
        return [
            'name.required' => 'Lütfen bir kategori adı giriniz !!',
            'name.min' => 'Kategori adı en az 2 karakterden oluşmalıdır !! ',
            'name.unique' => 'Böyle bir kategori zaten bulunuyor !!',
            
        ];
    }

 

Bütün bunları yaptınız. Hata mesajlarını yakalamak için ise $errorBag değişkenini kullanabiliriz. Yani bu hataları yakalamak için bir değişken tanımlıyoruz.

 protected $errorBag = "CategoryErrorBag";

CategoryErrorBag benim verdiğim bir adlandırmadır. Bunu view de şu şekilde yakalayabiliriz.

Kullandığımız formun en üstüne aşağıdaki kodu yapıştırabiliriz.

@if( $errors->CategoryErrorBag->isNotEmpty() )

  <div class="alert alert-error alert-dismissible">
     
      <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
      
      <h4><i class="icon fa fa-warning"></i> Hay Aksi!</h4>
      
      <ul>

        @foreach ($errors->CategoryErrorBag->all() as $error)
            <li style="margin-left: -15px"> {{ $error }} </li>
        @endforeach

       </ul>

   </div>

@endif

Sanırım gayet açıklayıcı.

Gelelim biraz sıkıntılı taraflara.

Siz bu Request Rule''u aynı zamanda update işlemlerinde de kullanmak isterseniz işler orada biraz karışıyor.

Herhangi bir şey yapmadan bile kaydete basarsak biz kategori adını unique olarak belirlediğimiz için hata alıyoruz. Böyle bir kategori zaten bulunuyor hatasını veriyordu.

Zaten beni de en çok uğraştıran şey bu oldu. Neyse ki arayıp buldum. Burada paylaşıyorum.

rules() metodunu aşağıdaki gibi düzenliyoruz.

use Illuminate\Http\Request;

.....

public function rules(Request $req)
{
    $rules = [
        'name' => 'required|min:2|unique:categories', 
    ];

    if ( $req->isMethod('PUT') ) {
         $rules["name"] = 'required|min:2|unique:categories,name,'.$req->id;
     }

    return $rules;
}

 

Laravel kaynaklarından öğrendiğimiz bilgilere göre eğer siz update işlemi yapacaksanız, kısaca form alanınızda bulunması gereken bir method var.

<form action="/foo/bar" method="POST">
    @method('PUT')
    @csrf
</form>

@method('PUT'), metodu ile update işlemlerini yapıyoruz.

Haliyle bir üstteki kod parçasını geri dönersek burada diyoruz ki eğer gelen istek metodu PUT metodu ise yeni kuralları uygula.

if ( $req->isMethod('PUT') ) {
    $rules["name"] = 'required|min:2|unique:categories,name,'.$req->id;
}

 

Kodların tüm hali aşağıdaki gibidir.

<?php

namespace App\Http\Requests;

use Illuminate\Http\Request;
use Illuminate\Foundation\Http\FormRequest;

class CategoryRequest extends FormRequest
{

    protected $errorBag = "CategoryErrorBag";

    public function authorize()
    {
        return true;
    }


    public function rules(Request $req)
    {
        $rules = [
            'name' => 'required|min:2|unique:categories',
        ];

        if ( $req->isMethod('PUT') ) {
        
            $rules["name"] = 'required|min:2|unique:categories,name,'.$req->id;
        }

        return $rules;
    }

    public function messages()
    {
        return [
            'name.required' => 'Lütfen bir kategori adı giriniz !!',
            'name.min' => 'Kategori adı en az 2 karakterden oluşmalıdır !! ',
            'name.unique' => 'Böyle bir kategori zaten bulunuyor !!',
        ];
    }
}

 

Evet, hepsi bu kadar..

Kolay gelsin.

 

 

 

 

 

 

738 Görüntülenme

Yorum Yap