Tech Starlog

Laravel Blade × JavaScript

投稿日:2026/02/11

本記事では、LaravelのBladeテンプレートとJavaScriptを組み合わせる方法について解説します。


Blade × JavaScript

Laravel開発では以下のようなケースが頻出します。

  • フォーム送信前のバリデーション
  • モーダル表示の制御
  • Ajax(fetch)による非同期通信
  • ページごとの簡易的なUI制御

パターン①:Blade内にそのままJavaScriptを書く

最もシンプルな方法です。

<button id="btn">クリック</button>

<script>
    document.getElementById('btn').addEventListener('click', function () {
        alert('クリックされました');
    });
</script>

注意点

  • HTML読み込み後に実行する
  • 大規模になると可読性が低下する

小規模ページ向けの方法です。


パターン②:@push と @stack を使う

レイアウトファイルで以下を定義します。

layout.blade.php

<!DOCTYPE html>
<html>
<head>
    <title>Sample</title>
</head>
<body>
    @yield('content')

    @stack('scripts')
</body>
</html>

子ビュー

@extends('layout')

@section('content')
<button id="btn">クリック</button>
@endsection

@push('scripts')
<script>
    document.getElementById('btn').addEventListener('click', function () {
        console.log('実行');
    });
</script>
@endpush

メリット

  • レイアウト構造を崩さない
  • ページごとにJSを分離できる

実務ではこの方法がよく使われます。


パターン③:BladeからJavaScriptへデータを渡す

Laravel側のデータをJSで使いたい場合があります。

Controller

return view('sample', [
    'user' => $user,
]);

Blade

<script>
    const user = @json($user);
    console.log(user.name);
</script>

なぜ @json を使うのか?

  • XSS対策
  • オブジェクトとして安全に渡せる

文字列連結で埋め込むのは危険です。


パターン④:CSRFトークンを使ったfetch通信

LaravelではCSRF対策が必須です。

metaタグをlayoutに追加

<meta name="csrf-token" content="{{ csrf_token() }}">

JavaScript側

const token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');

fetch('/api/sample', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-CSRF-TOKEN': token,
    },
    body: JSON.stringify({ name: 'Taro' })
});

これを忘れると419エラーになります。


パターン⑤:バリデーションエラーの表示連携

Laravel側のバリデーションエラーをBladeで表示できます。

<input type="text" name="name">

@error('name')
    <p class="error">{{ $message }}</p>
@enderror

JavaScript側でのリアルタイムチェックと、 サーバー側バリデーションを併用するのが実務の基本です。


意識すべきポイント

① JSは可能な限り分離する

  • resources/js にまとめる
  • Viteでビルドする

② データ埋め込みは最小限に

  • 大量データはAPI経由にする

③ Bladeは表示、JSは挙動に責任を持たせる

役割分担を明確にすることで保守性が向上します。


まとめ

  • 小規模ならscript直書き
  • 実務では @push を活用
  • データ受け渡しは @json を使う
  • fetch時はCSRFを忘れない