LoginSignup
1
0

More than 3 years have passed since last update.

Laravelの@jsonディレクティブには変数以外を入れてはいけない

Posted at

概要

〜ある日の午後の出来事〜

web.php
Route::get('hoge/{id}', 'HogeController@index')->name('hoge');

Route::get('fuga/{id}', 'FugaController@index')->name('fuga');

Laravel × Vue.jsでの開発中、このようなルートを設定して

<div id="app">
    <hogehuga
        :routes='@json([
            "hoge" => route("hoge", 1), 
            "fuga" => route("fuga" ,1), 
        ])'
    >
    </hogefuga>
</div>

BladeテンプレートからVue.jsにルートを渡してみたところ

スクリーンショット 2021-04-25 17.06.26.png

構文エラー
え???と思い、実際のコードを見てみると・・・

スクリーンショット 2021-04-25 17.02.26.png

なぜか、fugaの方のルートがパラメータ渡せていない & 配列やjson_encodeの閉じかっこが無い。。。

解決策

色々試してみても全く解決しそうになく、類似の事象もみつからない。このまま迷宮入りかと思いきや、ReadDoubleにこんな記述がありました。

Note: @jsonディレクティブは既存の変数をJSONとしてレンダするためだけに使用してください。Bladeテンプレートは正規表現ベースのため、複雑な式をディレクティブに渡すと予期しない不良動作の原因になります。

なるほどー。
今回のように@jsonディレクティブにroute関数などを使った複雑な式を直接入れると思わぬバグをうむ可能性があるみたい。

ということで、以下のようにして解決。

@php
    $routes = [
        "hoge" => route("hoge", 1), 
        "fuga" => route("fuga" ,1), 
    ];    
@endphp
<div id="app">
    <hogehuga
        :routes='@json($routes)'
    >
    </hogefuga>
</div>

@jsonディレクティブには変数以外を入れないように気をつけましょう。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0