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
Related
- 2026-04-15-responsive-component-contract — component’lerde prop expression geçme pattern’leri