LaravelのbladeやSmarty等のテンプレートエンジンからJavaSriptにデータを渡す際のベストプラクティスについて考えてみる

こんにちは。ゆうきと申します。
最近はReactやVueといったフロントエンドのフレームワークが流行っているので、モダンな開発環境で働いている方はテンプレートエンジンを使うことが少なくなっているかもしれませんね。
個人的にはこのフロントとサーバーサイドを切り離す流れはまだまだ続く。。というより、もっともっと加速していくと思っています。

しかしそうは言っても、テンプレートエンジンを用いているシステムもまだまだ多いです。
今回はそんなテンプレートエンジンを使用して開発をする際に悩むことの多い「JavaScriptへのデータの渡し方」について自分なりのベストプラクティスを考えてみました。

そもそもどんなやり方があるの?

さて、テンプレートエンジンからJavaScriptにデータを渡す方法は色々ありますが、パッと思いつくものを紹介します。

その1:inputタグ等のvalue属性内に直接書いちゃう方法

まず最初に思いつくのがこの方法です。

test.blade.php
// テンプレートファイル内の記述です
<input id="test" value="{{ $value }}">

↑こんな感じでinputタグのvalueに直書きしちゃうやり方です。JavaScriptでの受け取り方は下の通り

JavaScript
const test = document.getElementById('test').value;

シンプルで分かりやすく、悪くはない。
正直3つ4つくらいの変数を渡したいだけならこれで十分だと思います。
ただ、渡したい変数の数が多くなると、それを受け取るinputタグもかなり多くなるので面倒くさいのが弱点。

その2:scriptタグをべた書きしちゃう方法

こんな感じ

test.blade.php
// テンプレートファイル内の記述です
<script>
    const test = {{ $test }}
</script>

これはこれで動きますが、JavaScriptが分離されていないのでちょっと嫌だ。

その3:JSON形式にしたものをHTMLのタグに持たせる方法

こんな感じ

Controller.php
$test = array(
    'user'=> array(
        'id'=> 1,
        'name'=> 'taro',
        'role'=> 'admin',
    ),
);

$test = json_encode($test);

↑テンプレートファイルに渡す前にあらかじめJSONエンコードしておく

test.blade.php
// テンプレートファイル内の記述です。
<input id="test" type="text" value="{{ $test }}">

JavaScriptでの受け取り方は下の通り

test.js
const test = JSON.parse(document.getElementById('test').value);

JSONエンコードとか、js側でもparseしないといけないとか手間は増えるけど、この方法が一番めんどくさくなくて良いと思う。

まとめ

色々あるけど結局こうなると思う

  • 渡したい値が少ないときはinputタグのvalue属性に直接出力しちゃう
  • 渡したい値が多いときはjsonでやり取りする
ゆうき

都内某企業でWebエンジニアをやっている人。 普段はPHPとJavaScriptを使って業務を行ってます。 プライベートでは好き勝手にアプリや3DCGを作る個人サークルのStudio Babeをやっています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です