siradaninsan if ($validator->fails()) {
ile kontrol yaptığınız yerde validasyon hatası meydana gelirse HTTP 200 kodu ile hata mesajı dönüyorsunuz, yanlış, 422 hata kodu ile dönmeniz lazım. Diğer hata kısımlarında da yanlış yapmışsınız. Benim tavsiyem controller validation kullanılacaksa (ama tavsiyem form request kullanılması), buralara gereksiz müdahale edilmeyip Request içindeki validator'ün kullanılması:
https://laravel.com/docs/8.x/validation#quick-writing-the-validation-logic
Hata mesajlarıyla çalışırken frontend kısmında status diye alanlara bakılmaz. HTTP kodu, message alanı ve validation exception ise errors alanlarına bakılır. Şunu yapabilirsiniz:
if (Storage::disk('public')->exists('categories/'.$category->slug.".".$extension)) {
return new ValidationException::withMessages([
'slug' => 'Yüklediğiniz resme ait aynı adda bir dosya zaten var. Farklı adda bir resim yükleyin.'
]);
}
Mevcut slug varsa sonuna sayı ekle şeklindeki slug mantığınız yanlış. Slug zaten yeni-kategori-1 ise sizin sistem yeni-kategori-1-1 şeklinde slug oluşturacak, halbuki yeni-kategori-2 olması gerekiyor. Ben slug arka planda otomatik oluşturmuyorum, kullanıcının ekleme yaptığı formda bir input içinde gösteriyorum, aynı slug varsa hata veriyor, kullanıcı slug'ı elle değiştiriyor. Bunca yıldan sonra bulabildiğim en mantıklı çözüm bu çünkü ayrıca birçok müşterim bazı durumlarda da özel slug belirlemek istiyordu.
if ($request->has('image')) {
yanlış if ($request->hasFile('image')) {
olması gerekiyor.
if($request->image->storeAs('public/categories', $category->slug.".".$extension)){
burası yanlış, disk adını aşağıdaki gibi ayrı belirtmeniz lazım:
if($request->image->storeAs('categories', $category->slug.".".$extension, 'public')){
Son olarak son aşamada kategoriyi kaydederken hata alırsanız eklenen resim varsa silinmeden sunucuda kalacak. Hata meydana gelirse ve resim eklenmiş ise resmi silmeniz lazım. Böyle yerlerde ben transaction kullanırım:
$category = DB::transaction(function() use ($request) {
// Önce kategori
$category = Category::create(...);
// Sonra resim
if($request->hasFile('image')) {
// ...
}
return $category;
});
Bu şekilde sadece kategori oluştururken hata verirse exception fırlatır, resim eklemez. Diyelim ki kategori ok ama resim ekleyemedi, kategori de oluşmaz. Her ikisi de hatasız gerçekleşirse bana oluşturulan kategoriyi verecek:
https://laravel.com/docs/8.x/database#database-transactions