Herkese merhaba,
https://laravel.gen.tr/d/5160-laravel-crud-problemi
konusunda soru sorarken bulduğum bir yöntemi paylaşmak istedim. O konu çok uzadığı için yeni bir konu açıyorum.
Belki ihtiyaç duyan birisi olursa faydalanabilir.
Diyelim ki klasik bir CRUD işleminde bir kayıt yapacağız. Tablomuzda bir çok sütun olsun.
Form request sınıfı oluşturduktan sonra
Model::create($request->validated());
kullanarak işlemi tamamlayabiliyoruz. Ancak 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 gerekiyor.
Bunu macro yazarak elde edebiliyoruz.
app/Providers/AppServiceProvider.php dosyamıza gidelim.
<?php
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);
});
}
}
Burada boot() metodu içerisinde tanımlamamızı yapıyoruz. Artık controller içerisinde
$request->validatedExcept(['istemediğimiz_alan']);
şeklinde kullanım yapabileceğiz.
Örneğin basit bir Slider modelimiz olsun ve create işlemi yapalım.
Form request sınıfı oluşturalım bu işlem için;
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:
<?php
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;
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\SliderStoreRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(SliderStoreRequest $request) : RedirectResponse
{
// validated metodu ile form request doğrulamasından geçen alanları $data dizisi içine kaydettim.
$data = $request->validated();
//Burada AppServiceProvider içerisinde tanımladığımız yöntemi kullanıyoruz
// artık bize doğrulamadan geçen image hariç tüm alanları verecek
//create yerine make kullanarak bir model instance oluşturuyorum ancak veritabanına kaydetmiyorum
// create kullanırsam image alanım nullable tanımlı olmadığı için sql hata verecek
$slider = Slider::make($request->validatedExcept(['image']));
// model instance oluştu ancak veritabanına kaydedilmedi. Şimdi onun içindeki
//image alanına ulaşıp resim upload işlemini gerçekleştiriyorum
// $data['image'] belirterek $request->validated içerisinden geçmiş image alanımı kullandım
// son olarakta save() ile modeli kaydediyoruz.
$slider->image = Helper::someFunction($data['image'], 'folder');
$slider->save();
//return...
}
Kayıt işleminde kullanılacak bir çok sütun varsa ve 1-2 sütuna çeşitli işlemler yapmanız gerekiyorsa böyle bir yaklaşım faydalı olabilir diye düşünüyorum. Böylece Controller içerisini de kısaltarak temiz tutmuş olduk.