Laravel 12へのアップグレード時によく発生するParseErrorの原因を実例とともに解説。@auth構文とJSON-LD記述の問題を中心に、確実な修正方法をご紹介します。
Laravel 12移行で頻発するParseErrorにお困りではありませんか?
Laravel 12への移行作業を進めていて、こんなエラーに遭遇していませんか?
ParseError: syntax error, unexpected end of file, expecting "elseif" or "else" or "endif"- 今まで正常に動作していたBladeテンプレートが突然エラーになる
- JSON-LDを含むページで謎のパースエラーが発生する
先日、神奈川の製造業のお客様のECサイトをLaravel 12に移行した際、まさにこれらの問題に直面しました。20年以上Web制作に携わってきた当社でも、新しいバージョンの仕様変更には常に注意が必要です。
今回は、Laravel 12移行で特に頻発する2つのParseError問題について、実際の解決事例とともに詳しく解説いたします。
問題1: @auth...@else...@endauth構文が使えなくなった
症状と原因
Laravel 12では、Bladeコンパイラの仕様が変更され、@authディレクティブ内での@else使用がサポートされなくなりました。
{{-- Laravel 11まで動いていたが、Laravel 12でエラー --}}
@auth
<a href="/mypage">マイページ</a>
@else
<a href="/login">ログイン</a>
@endauth
このコードは以前は問題なく動作していましたが、Laravel 12では@authが条件分岐ディレクティブ(@if系)ではなく、認証状態チェック専用のディレクティブとして扱われるようになったためエラーが発生します。
解決方法
@authと@guestを分離して記述する方法に変更します:
{{-- Laravel 12で推奨される書き方 --}}
@auth
<a href="/mypage">マイページ</a>
@endauth
@guest
<a href="/login">ログイン</a>
@endguest
より複雑な条件分岐が必要な場合は、従来の@if(Auth::check())を使用します:
{{-- 複雑な条件分岐が必要な場合 --}}
@if(Auth::check())
<div class="user-menu">
<span>こんにちは、{{ Auth::user()->name }}さん</span>
<a href="/mypage">マイページ</a>
</div>
@else
<div class="guest-menu">
<a href="/login">ログイン</a>
<a href="/register">新規登録</a>
</div>
@endif
問題2: JSON-LDの@記号がBladeディレクティブとして誤認識される
症状と原因
SEO対策でJSON-LD(構造化データ)を実装している場合、Laravel 12のBladeコンパイラが@contextや@typeをディレクティブとして解釈しようとしてエラーが発生します。
// このようなJSON-LDでエラーが発生
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "{{ $company->name }}"
}
</script>
解決方法1: @verbatimディレクティブを使用
変数を含まない静的なJSON-LDの場合:
<script type="application/ld+json">
@verbatim
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "株式会社サンプル"
}
@endverbatim
</script>
解決方法2: @@でエスケープ
動的な値(変数)を含む場合:
<script type="application/ld+json">
{
"@@context": "https://schema.org",
"@@type": "Organization",
"name": "{{ $company->name }}",
"url": "{{ $company->url }}",
"address": {
"@@type": "PostalAddress",
"addressLocality": "{{ $company->city }}",
"postalCode": "{{ $company->postal_code }}"
}
}
</script>
解決方法3: コントローラーで処理
複雑なJSON-LDの場合は、コントローラーで配列を作成してBladeに渡す方法もあります:
// コントローラー
public function show(Company $company)
{
$jsonLd = [
'@context' => 'https://schema.org',
'@type' => 'Organization',
'name' => $company->name,
'url' => $company->url,
];
return view('company.show', compact('company', 'jsonLd'));
}
// Bladeテンプレート
<script type="application/ld+json">
{!! json_encode($jsonLd, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) !!}
</script>
実際の移行作業での注意点
先ほどのお客様の移行作業では、以下の手順で問題を解決しました:
1. 全Bladeファイルの一括検索
# @auth...@else パターンを検索
grep -r "@auth" resources/views/ | grep -v "@endauth"
# JSON-LDの@記号を検索
grep -r "@context\|@type" resources/views/
2. 段階的な修正とテスト
一度にすべてを修正するのではなく、ページごとに修正してテストを繰り返しました。これにより、他の問題との切り分けが容易になりました。
3. よくある失敗パターン
移行作業中に遭遇した失敗例:
@@エスケープを忘れてJSON-LDの一部でエラーが継続@guestの条件が@authと重複してしまい、意図しない表示になる- ネストした条件分岐で
@endifの数が合わなくなる
まとめ:確実な移行のために
Laravel 12への移行では、これらのBladeテンプレートの仕様変更を理解しておくことが重要です。
移行後の成果:
- パフォーマンスの向上(約15%の処理速度改善を確認)
- セキュリティの強化
- 新機能の活用が可能に
今すぐできること:
- 現在のプロジェクトで
@auth...@elseパターンを検索 - JSON-LDを使用している箇所を洗い出し
- テスト環境でLaravel 12を試す
Laravel移行は技術的な知識だけでなく、実際のプロジェクトでの経験が重要です。当社では20年以上の実績をもとに、お客様のビジネスを止めることなく確実な移行をサポートしております。
Laravel 12移行でお困りの際は、ぜひご相談ください。事前調査から移行完了まで、安心してお任せいただけます。