Blade şablonlarınızda schema.org JSON-LD kullanıyorsanız ve Laravel 12 sürümüne yükseltirseniz, bu görünümlerinizin bozulmasına neden olabilirsiniz. Bu durum, bir devir uyarısı olmadan sessizce gerçekleşebilir.
Geçen hafta, 12.44.0 sürümünü kullanan bir blog dizininde bu sorunla karşılaştık. Sayfa, üç hafta boyunca her ziyaretçi için HTTP 500 hatası veriyordu ve kimse fark etmedi. 12.20+ sürümüne sahip olan aynı semptomu gösteren bir kamu sorunu var: laravel/framework#56248.
Bu durumu anlamanız için 90 saniyelik bir özet hazırladık.
Semptom
İçinde "@context" anahtarını barındıran herhangi bir Blade görünümü şunu fırlatır:
syntax error, unexpected end of file, expecting "elseif" or "else" or "endif"
(View: /resources/views/blog/index.blade.php)
Görünüm kendisi düzgün analiz ediliyor. Her @if/@endif, @foreach/@endforeach, @push/@endpush dengeli. Ancak, storage/framework/views/ içindeki derlenmiş görünüm bozulmuş.
Neden
Laravel 12, istek kapsamındaki Bağlam özelliği ile birlikte @context Blade direktifi ekledi. Bu özellik, vendor/laravel/framework/src/Illuminate/View/Compilers/Concerns/CompilesContexts.php dosyasında yer almaktadır.
@context, açılış blok direktifidir. Daha sonra şablonda bir eşleşen @endcontext bekler.
Ancak, schema.org JSON-LD şu şekilde görünür:
"application/ld+json">
{
"@context": "https://schema.org",
"@type": "Blog",
"name": "..."
}
Blade derleyicisi şablonu taradığında, JSON içindeki @context kelimesini görerek bunu bir direktif bloğunun açılışı olarak kabul eder ve @endcontext bekler. Ancak hiçbiri görünmez. Derleyici en sonunda dosyanın sonundaki hatayı bildirir; bu, gerçek sebebin 200 satır sonrasına işaret eder.
Derlenmiş dosyaya storage/framework/views/ altında baktığınızda kötü çıktıyı görebilirsiniz:
" $__contextArgs = [];
if (context()->has($__contextArgs[0])) :
if (isset($value)) {$__contextPrevious[] = $value; }
$value = context()->get($__contextArgs[0]); ?>": "https://schema.org",
Bu aslında, bir literal JSON anahtarı olmalıydı.
Kapsam
Bu durum yalnızca literal @context metnini etkiler. json_encode($data), Js::from($data) veya @json($data) ile üretilen JSON-LD etkilenmez; zira bu yöntemler çıktısını PHP üzerinden yazar ve Blade’in direktif ayrıştırıcısıyla çalışmaz.
Çözüm
İki karakter. @ karakterini başka bir @ ile kaçırın:
Blade, @@context ifadesini, render edilen HTML içinde literal bir @context olarak işler. Başka hiçbir JSON-LD anahtarı çakışmaz — @type, @id, @graph Blade direktifleri değildir — bu nedenle kaçırmanız gereken tek karakter budur.
Eğer görüntüleriniz bozulmuş durumda önceden önbelleğe alındıysa, bir kez php artisan view:clear komutunu çalıştırın. Laravel, değiştirilen Blade dosyalarını sonraki istekte otomatik olarak yeniden derler; bu nedenle, yalnızca eski bir derlenmiş görünüm varsa bunu yapmanız gerekir.
Her Durumu Bulma Yöntemi
grep -rn '"@context"' resources/views
O desenin göründüğü her yerde onu kaçırın. Blog dizininiz çalışsa bile, başka şablonlarda (SSS şeması, Ürün şeması, Breadcrumb şeması, Makale şeması) JSON-LD bulabileceğiniz için bu işlemi yapmakta fayda var. Hepsi @context anahtarını üst düzey bir anahtar olarak kullanır. Tüm bunlar, yükseltme sonrasında aynı şekilde bozulur.
Biz üç yer bulduk. Bir tanesi her hit için 500 hatası veriyordu. Diğer ikisi ise yükseltme sonrasında ziyaret edilmediği için içinde oldukları şablonlardaydı.
Laravel’ın Davranışını Değiştirme Önerim
Blade derleyicisi @context ifadesini : ile karşılaşırsa, bir hata uyarısı vermesi geliştirici aşamasında bunu yakalayabilir. JSON-LD anahtarları, bu desen için baskın bir durumdur; kullanıcı tanımlı direktifler genellikle parantez ya da argüman alır. Bir sezgisel uyarının düşük maliyetli ve yüksek değerli olacağı düşüncesindeyim.
Şu anda: @@context kullanın ve devam edin.
(Açıklama: Bu hatayı yaşadığımız Apps66’da çalışıyorum. Düzeltme, tek önemli noktadır.)
Kaynak: Orijinal Makale


