Merhaba,
Birkaç farklı yerde aynı sebeple oluşan bir sorun gözüme çarptı. Siz bu soruna nasıl çözüm buldunuz merak ediyorum.
Bir kayıt veya güncelleme formumuz olduğunu varsayalım. POST veya PUT ile request gönderiliyor ve controller tarafında gerekli veritabanı kaydı tamamlandı tamamlanıyor. Eğer store() veya update() içinde redirect ile index'e yönlendirmezsek ve doğrundan index view dosyasını gerekli veriyle beraber çağırırsak request bellekten silinmediği için sayfa her yenilendiğinde yeniden request işlendiği için veritabanı işlemleri tekrar tekrar yapılıyor. Bu da sorun çıkmasına sebep oluyor. Bu zaten böyle yapılmaz yönlendirmen gerekli diyorsanız ikinci örneğe geçeyim (-Zaten yönlendirmemek CRUD mantığına aykırı olduğu için ben böyle anlattığım gibi yapmıyorum. Soruna vurgu yapmak için örneklendirdim -);
İyzico entegrasyonu yaptıktan sonra ödeme işleminin yapılması için ödeme formunu view içinde gösteriyorum. Arından kullanıcı bilgilerini girip gönderiyor ve İyzico'dan POST ile bana token değeri dönüyor. Ben de bu token değeriyle ödemenin sonucunda göre gerekli diğer veritabanı işlemlerini tamamlıyorum ve view ile sonucunu gösteriyorum. Eğer sayfa yenilenirse request hafızada olduğu için token yeniden geliyor ve aynı senaryo işleniyor. Kullanıcı bunu bilinçli olarak yaptığında ise hak etmediği kadar fazla kredi kazanıyor. Bu örnekte de işlem sonrası yönlendirebilirim ama gereksiz kod kalabalığı olmasını istemiyorum. Ödeme başarısızsa aynı request bilgileriyle tekrar ödeme formunu açıyorum. Eğer yönlenirse tekrar fazla kod yazarak ödeyemediği faturayı bulup ödetmem gerekiyor.
Bunlar yine bir kod fazlalığıyla çözülebilecek sorunlar. Bir de şöyle bir örneğim var;
https://github.com/uxweb/sweet-alert Bu paketi kullanarak işlem sonrası mesaj veriyorum. Gayet güzel sorunsuz çalışıyor ama bir request kusuru var. Örneğin panelde bir form var. Formu POST veya PUT ile gönderdikten sonra;
alert()
->success("MESAJ")
->setVisible(true)
->setClosable(true);
Kodu ile mesajımı request'e taşıması için yüklüyorum ve normal request redirect ile index'e gidiyorum. Index kendi içinde view dosyasını yüklüyor ve view içindeki aşağıdaki kodla mesajım görünüyor.
@if (Session::has('sweet_alert.alert'))
<script>
swal({
text: "{!! Session::get('sweet_alert.text') !!}",
title: "{!! Session::get('sweet_alert.title') !!}",
timer: {!! Session::get('sweet_alert.timer') !!},
icon: "{!! Session::get('sweet_alert.type') !!}",
buttons: "{!! Session::get('sweet_alert.buttons') !!}",
});
</script>
@endif
Buraya kadar bir sıkıntı yok, bundan sonra sorun başlıyor. Eğer kullanıcı index sayfasından herhangi bir sayfaya gitse ve geri tuşuyla geri gelse paketle beraber taşıdığım mesaj request içinde tekrar işlendiği için mesaj tekrar görünüyor ve kullanıcı son yaptığı işlemi 2 kez yapmış gibi hissediyor. Özetle; panelde kullanıcı oluşturma sayfasından kullanıcı oluşturduk, işlem bitti bizi kullanıcı listesine yönlendirdi ve biz mesajı gördük. Sonra makale linkine tıkladık. Ardından şu listeye tekrar bakayım diye geri butonuna bastık ve karşımıza mesaj çıktı. Kullanıcı oluşturuldu ! Aslında oluşturulması ama request içindeki mesaj yine işlendi.
Projeyi müşteriye teslim ederken bunu anlatamıyorum. Zaten kendi projem de olsa sorun can sıkıcı bir sorun.
3 örnekte de kullanılabilecek şekilde request ile işimiz bittikten sonra tümüyle yok etmemiz mümkün mü ? Geri de gitse sayfa da yenilese bir daha karşısına çıkmasın. Tarayıcı "tekrar göndermek ister misiniz" diye sormasın.
Siz bu sorunu nasıl çözüyorsunuz ?
Şimdiden teşekkürler.