Proje: Okul Platform · Hub: Okul Platform — Incidents

Semptom

kvkk=1 ve notification=2482 (USER_NOTIFICATION_ALL_ID → marketing all) olan giriş yapmış kullanıcı, okul yorumu (review) gönderdiğinde son adımda kaydolmuyor. UI’da görünür hata mesajı yok. Sözleşme/marketing checkbox’ı da sorulmuyor (consent zaten verildiği için blade render etmiyor — doğru davranış).

Network’te /ajax/addComment 200 dönüyor ama body:

{"message":"Kullanıcı sözleşmesini kabul etmelisiniz. (and 1 more error)","errors":{"kvkk_consent":["..."],"marketing_consent":["..."]}}

Root cause

app/Http/Requests/Front/SchoolCommentRequest.php:43-50 içindeki prepareForValidation():

foreach (['kvkk_consent', 'marketing_consent'] as $key) {
    $this->merge([
        $key => is_array($this->input($key)) ? reset($this->input($key)) : $this->input($key),
    ]);
}

Request’te key gerçekten yokken bile $this->input($key) null döner, merge ile key null olarak request’e eklenir → array’de “present” sayılır.

Validation rule (consented user):

'kvkk_consent' => ['sometimes', 'accepted'],
'marketing_consent' => ['sometimes', 'accepted'],

Laravel’in sometimes semantiği “input array’de varsa validate et”; prepareForValidation null’la varlığı zorla yarattığı için sometimes aktifleniyor, sonra accepted null’a takılıyor → validation hatası.

FE tarafında neden silent: comment-show.js hatayı #error-{key} div’ine yazıyor; consent checkbox’ları render edilmediği için bu div’ler DOM’da yok → mesaj görsel olarak hiçbir yere düşmüyor. Kullanıcı “kaydetmedi ama hata da göstermedi” algılıyor.

Çözüm

FE-only fix (BE’ye dokunulmadı):

  • resources/views/frontend/reviews/comment.blade.php (desktop)
  • resources/views/mobile/reviews/comment.blade.php (mobile)

Consented user dalı @else ile <input type="hidden" name="kvkk_consent" value="1"> ve <input type="hidden" name="marketing_consent" value="1"> render eder. Bu hem prepareForValidation’ı doğru veriyle besler hem accepted rule’unu geçirir.

resources/views/frontend/lead_pool/form.blade.php:179-186 zaten aynı pattern’i kullanıyor (KVKK için). Aradaki tutarsızlık review form blade’lerine taşındı.

Neden BE düzeltmedik

Bu noktada FE pattern lead-pool form ile zaten kararlaştırılmış; review formlarına da uygulamak en az invaziv yol. prepareForValidation guard’ı asıl root cause olsa da, BE değişikliği projenin kuralı gereği ayrı bir onay gerektiriyor; kullanıcı FE-only ile gitmeyi seçti.

İleride yeni bir form daha aynı tuzağa düşerse, BE tarafında prepareForValidation’a $this->has($key) guard’ı eklemek doğru kalıcı çözüm.