Proje: Okul Platform · Hub: Okul Platform — Incidents

Semptom

wizard-progress.blade.php component’inde progress text literal olarak gözüküyordu:

Adım $step + 1 / $questions.length

— template literal ${step + 1} interpolasyonu yapılmamıştı.

Root Cause

Yazılan kod:

x-text="`Adım ${{{ $currentExpr }}} / ${{{ $totalExpr }}}`"

Blade parser {{{ $currentExpr }}} içindeki üçlü braces’i { + {{ $currentExpr }} + } olarak işliyor. Compile sonucu:

x-text="`Adım ${step + 1} / ${questions.length}`"

Bu teorik olarak doğru görünüyor ama JS tarafında ${step + 1} aslında ${{step + 1}} gibi parse ediliyor (HTML entity/escape kombinasyonu) — template literal interpolation başarısız, string raw kalıyor. Alpine hata vermiyor, literal metin ekrana geçiyor.

Çözüm

Template literal yerine JS string concatenation kullan — Blade {{ }} ile çakışmaz:

x-text="'Adım ' + ({{ $currentExpr }}) + ' / ' + ({{ $totalExpr }})"

Compile sonucu:

x-text="'Adım ' + (step + 1) + ' / ' + (questions.length)"

Alpine valid JS expression görür, doğru evaluate eder → “Adım 1 / 11”.

Genel Kural

Alpine x-text + Blade prop = template literal KULLANMA.

  • Dinamik Blade prop’u JS template literal ${...} içine direkt koyma
  • Sebep: ${{ php }} iç içe paren’ler farklı parser’lara gider (PHP Blade + HTML + JS), hatalı interpolation’a neden olur
  • Güvenli pattern: 'literal' + ({{ $phpExpr }}) + ' more' — paren’ler JS precedence’ı korur