Merhabalar, bazen projelerimizde bir hata oluştuğunda bu durumu son kullanıcıya bildirmek isteriz. Laravel’de bu işi bizim için yapan bir fonksiyon var: WithError() veya WithErrors(). İkisi de bizim belirttiğimiz hata mesajını geçici olarak tutar. (Yani sayfa yenilenene kadar.)
Öncelikle withError() ve withErrors() arasındaki farkı anlayalım. İkisinin arasındaki fark şudur: İkisi de verilerinizi Flash data olarak Session’da tutar fakat WithError() fonksiyonu veriyi sessionda ‘error’ keyi ile saklar, withErrors() fonksiyonu ise ‘errors’ keyi ile saklar.
withError() ile flash session’a attığınız mesajı viewde ekrana basmak istediğimiz zaman mesajı göstermek istediğimiz yere {{ Session(‘error’) }} yazmamız yeterlidir. Aynı işi withErrors() ile yaptığımız zaman ise {{ $errors->get(“key”) }} (Bu kısmı aşağıda Controller sayfasını yazarken açıklayacağım.) yazmamız yeterli olacaktır.
Şimdi bir örnekle bu durumu açıklayalım. Örneğin bir login sayfası yaptığımızı düşünelim ve bir kullanıcının bilgilerini girdiğini fakat veri tabanında böyle bir kullanıcının olmadığını varsayalım. Bu durumda eğer formu Ajax ile göndermediysek (çünkü JSON ile hata mesajını kolaylıkla geri döndürebiliriz.) hatayı da boş bir sayfada (yani Controller sayfasının içinde) göstermek istemiyorsak sayfayı login’e geri yönlendirip hata mesajını göstermemiz gerekir.
Şimdi elimizde bir adet login.blade.php adında Login sayfamız (resources > views) ve bu sayfanın LoginController.php (app > Http > Controllers) adında bir controller dosyası olsun.
login.blade.php dosyasının içi şu şekilde olsun:
<!-- withErrors() fonksiyonu kullanıldığında -->
@if( isset($errors) )
<p>{{ $errors->first() }}</p>
//Veya
<p>{{ $errors->get('key') }}</p>
@endif
<!-- withError() fonksiyonu kullanıldığında -->
@if( session::has("error") )
<p>{{ session("error") }}</p>
@endif
<form action="{{ route("route_adi") }}">
<input type="text" name="email">
<input type="password" name="password">
<input type="submit" value="Gönder">
</form>
Şu an çok basit bir login formumuz var. Bu formda ek olarak sadece $errors değişkenini görüyoruz. İşte bu değişkeni laravel withErrors() fonksiyonunu kullandığımızda bizim için oluşturuyor ve içerisine bizim istediğimiz hata mesaj(lar)ını atıyor. Şimdi de controller dosyasına bir göz atalım.
LoginController.php dosyasının içi de bu şekilde olsun:
<?php //Burada ilgili use tanımlamalarının olduğunu, veri tabanına bağlandığınızı ve kullanıcının girdiği bilgilerin veri tabanında olmadığını farz edelim. O zaman önceki sayfaya gitmemiz ve mesajı ekranda göstermemiz gerekiyor. //withErrors() fonksiyonunu aşağıdaki gibi kullandığımızda view dosyamızda baska_bir_key isimli hatayı ekrana basmak için{{ $errors->get('baska_bir_key') }} yazmamız yeterli oluyor. Eğer form gönderilirken kullanıcının girdiği bilgileri de geri döndürmek istersek withInput()'u eklememiz yeterli olacaktır. Tabii viewdeki inputun value değerine bunu eklememiz gerekiyor. Örneğin; <input type='text' name='username' value='{{ old('username') }}> return back()->withErrors(['key' => 'mesaj', 'baska_bir_key' => 'başka bir mesaj'])->withInput(); //withError() fonksiyonunu ise şu şekilde kullanıyoruz: return back()->withError("hata mesajı"); //viewde bu mesajı {{ session('error') }} şeklinde ekrana basabiliriz.
Evet kodlarımız bu kadar. Bu yazımızda bir hata mesajını en basit şekilde önceki sayfaya nasıl göndereceğimizi, withError() ile withErrors() arasındaki farkın ne olduğunu ve kullanım şekillerini öğrendik. Son olarak bu fonksiyonları kullandığımızda NULL değeri dönüyorsa yani veri gelmiyorsa ne yapacağımızı öğrenelim ve blogumuzu bitirelim 🙂
İlk karşılaştığımda yaklaşık olarak bir günümü alan bu durumu çok basit bir tanımlamayla çözdüm.
Eğer bir session, flash session, withError() ya da withErrors() fonksiyonuyla oluşturduğunuz flash session datalarını başka bir sayfaya taşıyamıyorsanız bunun en basit şekilde çözmenin yolu şudur:
- app > Http > Kernel.php dosyasını açın,
- $middleware dizisinin içine \Illuminate\Session\Middleware\StartSession::class ekleyin.
Son görünümü şu şekilde olacaktır:
protected $middleware = [
//diğer classlar
...,
\Illuminate\Session\Middleware\StartSession::class,
];
Sorununuz bu sayede çözülecektir. İyi kodlamalar 🙂