Laravel'de Form Request Sınıfı İçin Macro Oluşturmak

22 Eki 2021
Laravel'de Form Request Sınıfı İçin Macro Oluşturmak

Herkese merhaba,

Bu yazımızda, Laravel ile kendi macromuzu yazmayı öğreneceğiz.

Bir çok sütuna sahip olan bir veritabanı tablomuz olsun ve klasik CRUD işlemleri yapacak olalım.

Bildiğiniz üzere, Form request sınıfı oluşturduktan sonra kayıt işlemini basitçe yapabiliyoruz:

Model::create($request->validated());

Burada, $request->validated() bize doğrulamadan geçmiş alanları döndürüyor ve create fonksiyonu ile tek seferde işlemi tamamlamış oluyoruz.

Diyelim ki bu sütunlardan birisi resim alanı olsun ve resmi kaydetmeden önce üzerinde bazı işlemler yapmak isteyelim. Yeniden isimlendirme, boyutlandırma vs…
Burada validated içerisinden doğrulamayı geçmiş, resim alanı hariç kısımları almamız gerekiyor.

Bunu macro yazarak elde edebiliyoruz.
app/Providers/AppServiceProvider.php dosyamıza gidelim.

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
       //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Request::macro('validatedExcept', function ($except = []) {
            return Arr::except($this->validated(), $except);
        });
    }
}

validatedExcept isimli metodumuzu boot() içerine tanımladık. Artık Controller içerisinde;

$request->validatedExcept(['istemediğimiz_alan']);

şeklinde kullanım yapabileceğiz.

Örneğin Slider isimli modelimiz olsun ve içerisinde Slider Ekleme işlemi gerçekleştirecek olalım.

İlk önce 'create' işlemi için bir Form Request sınıfı oluşturmamız gerek. Neyse ki Laravel'in bizim için hazırladığı komutlar var!

php artisan make:request SliderStoreRequest

Bu komut bize form request sınıfımızı oluşturacak app/Http/Requests/SliderStoreRequest.php
Şimdi burada kuralları belirleyelim:

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class SliderStoreRequest 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 [
            'image' => 'some_rules',
            'title' => 'some_rules',
            'body' => 'some_rules',
            'url' => 'some_rules',
            //varsa başka alanlar...
        ];
    }
}

Şimdi controller içerisinde store metodumuza gidelim. Örneğin SliderController;

public function store(SliderStoreRequest $request) : RedirectResponse
    {
         // validated metodu ile form request doğrulamasından geçen alanları $data dizisi içine kaydettik.
        $data = $request->validated();
        $slider = Slider::make($request->validatedExcept(['image']));
        $slider->image = Helper::someFunction($data['image'], 'folder');
        $slider->save();
        return redirect(route('sliders.index'))->withSuccess('Kayıt başarılı!');
    }

Gördüğünüz gibi; validatedExcept metodumuzu kullanarak 'image' hariç, doğrulamadan geçen tüm verileri tek seferde yakaladık.

Burada create yerine make kullanarak model instance oluşmasını, ancak veritabanına henüz kayıt edilmemesini sağladık.

'image' alanımız MySQL tablomda NULLABLE tanımlı olmadığı için, create kullansaydık hata alırdık.

Ardından 'image' üzerinde Helper sınıfımızı çağırarak resim upload , resize ve yeniden isimlendirme gibi işlemleri gerçekleştirdik.

Kendi Helper sınıflarınızı oluşturmayı bilmiyor iseniz, daha önceki yazımızı ziyaret edebilirsiniz.

Son olarak save() metodunu kullanarak Modelin veritabanımıza kayıt edilmesini sağladık.

Gördüğünüz gibi, bütün sütunları tek tek yazmak yerine 5 satır kod ile kayıt işlemini tamamlamış olduk.

Sizde bu şekilde, kendi özel durumlarınız için macrolar oluşturabilir; projelerinizde değerlendirebilirsiniz.

Detaylı bilgiler için Laravel resmi dokümantasyonlarını ziyaret etmeyi unutmayın!

YAZAR : Boran BAR