質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

4回答

1860閲覧

laravel→からjsにデータ渡す、その後のjs側での変数存在の確認方法について(vue.js)

kazoogon

総合スコア281

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2018/05/26 12:22

編集2018/06/01 09:25

laravel5.5(vue.js)を使用し、学校システムを構築しております

実現したいこと

hoge.comページのloginボタンを押したらlogin modalが現れる(実装済み)

hoge.com/login のurlにアクセスされたら(cookie切れていたり、login必要なページurlを直接たたいたりした場合)
→mainページのlogin modalが表示されている状態のページを表示したい

実装方法

PHP→jsにhoge.com/loginアクセスの場合何か情報を送る
→vue.jsのdata情報を切り替えて、modalを出現させた状態にしたい

//AuthenticatesUsers.php trait AuthenticatesUsers { use RedirectsUsers, ThrottlesLogins; public function showLoginForm() { //mainページに飛ぶようにし、login = trueという情報を送る return view('main')->with([ 'login' => true, ]); } //以下省略 }
//mainページのjs部分(modalのhtml部分が必要でしたら、追加いたします) //このようにPHPのissetのようにしたいが、Undefined variable: login のエラー if(typeof @json($login) == 'undefined'){ var login = @json($login); } Vue.component('modal', { template: '#modal-template', props: ['show'], mounted: function () { document.addEventListener("keydown", (e) => { if (this.show && e.keyCode == 27) { this.close(); } }); }, methods: { close: function () { this.$emit('close'); } } }); new Vue({ el: '#app2', data: { showModal: false,//この値をhoge.com/loginにアクセスされた場合はtrueにしたい } });

問題点

①既にコード内に書きましたが、PHP->JSに情報を投げる
→isset内のjson化ですでに$loginが無いのでエラーが出る

②また情報をjs側にて取得できた場合もどのようにdataを変更すればよいのか?

よろしくお願いいたします。

回答を受けての追記

//この書き方ではdataがudefinedのエラーが下のnew Vue箇所で出る、console.logでif文の中を通っていることは確認済み(しかしif文の外に書くとエラーは出ない!) if(typeof @json($data) != 'undefined'){ const data = @json($data); } //login modalを表示するしないのif文の書き方ですが、この書き方よりもっと賢いやり方はないのかな??と思っております if(data.login == true){ new Vue({ el: '#app2', data: { showModal: true, } }); }else{ new Vue({ el: '#app2', data: { showModal: false, } }); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

euledge

2018/05/30 16:05

$loginをhtml側でレンダリングしたときには値は渡っているのでしょうか?
guest

回答4

0

自己解決

https://laracasts.com/discuss/channels/laravel/opening-a-model-window-from-a-methodroute
こちら参考
@if(!empty($data) && $data == true)
<script>
//modal表示のコード
</script>
@endif

このようにlaravelのif文で囲い、中にscriptを挿入

投稿2018/06/15 09:45

kazoogon

総合スコア281

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

laravelについて経験がなかったため、Bradeの変数展開の挙動がわからなかったのですが、ちょっと調べて確認してみたら解決策見つけたので追加で回答します。

必要だったのは、Bladeから渡される変数が undefinedだった場合の対応だけだったようです。
したがって元々のPHPでBlade変数に渡す部分は以下のままで問題ないです。

php

1return view('main')->with([ 2 'login' => true, 3]);

Javascript側では、@json()を行う前に@issetが必要でした。

<script> var login = false; //$loginがundefinedの場合の初期値 @isset($login) login = @json($login); // jsの変数login = 1になります @endisset if (login) { } </script>

以上を踏まえて、以下ではどうでしょうか?

js

1new Vue({ 2 el: '#app2', 3 data: { 4 showModal: false, 5 }, 6 mounted: function () { 7 let login = false; 8 @isset($login) 9 login = @json($login); 10 @endisset 11 this.showModal = login; 12 } 13});

また、これは今回の質問の範囲を超えるかもしれないのですが、気になったので補足します。
larabelで認証の機能を使っていれば、Bladeで以下のような制御できるようです。したがってコントローラーでそもそもフラグを渡す必要がないのではないかと思います。

php

1@unless (Auth::check()) 2 あなたはログインしていません。 3@endunless

php

1@auth 2 // ユーザーは認証済み 3@endauth 4 5@guest 6 // ユーザーは認証されていない 7@endguest

上の説明はLaravel 5.5 Bladeテンプレートの認証ディレクティブの項目にあります。

投稿2018/06/02 17:12

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この書き方ではdataがudefinedのエラーが下のnew Vue箇所で出る、console.logでif文の中を通っていることは確認済み(しかしif文の外に書くとエラーは出ない!)

に関しては、変数スコープの問題です。constやletで定義された変数のスコープはそのブロック内になりますので、dataは if文の中でしか参照することができません。外で見る必要があるのであれば if文の外で変数定義をする必要があります。

サーバー側で login が渡されなかった場合も考慮してこの部分は以下のようにしてみました。

js

1let login = false 2if(typeof @json($data) != 'undefined'){ 3 const data = @json($data); 4 if(data.login) { 5 login = true; 6 } else { 7 login = false; 8 } 9}

以下、 data.login が参照できるようになった前提でのVueインスタンスへの初期値の与え方の説明です。

Vue.jsにはインスタンスライフサイクルフックというものがあります。Vueのインスタンスが作成される特定の段階においてユーザーが処理を追加できるものです。

よく使うのは mounted と呼ばれる。画面のレンダリングが完了したときに行う処理のフックです。
この中で先のサーバーから渡された値を Vueで管理するdataに渡すことができます。

Vue公式ガイド - インスタンスライフサイクルフック

js

1new Vue({ 2 el: '#app2', 3 data: { 4 showModal: false, 5 }, 6 mounted: function () { 7 this.showModal = data.login; 8 } 9});

投稿2018/06/01 16:11

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazoogon

2018/06/01 19:56

ありがとうございます。 おかげ様でloginのモーダルが表示されるようになりました。 が、しかし「if(typeof @json($data) != 'undefined')」の記述でundefinedのエラーが$dataが渡されていないとき(普通にページを開いたとき)に発生してしまいます。 $dataのままではJSで使用できず、json形式にしようとしても、そのデータが定義されてもいないと怒られ困っております。。
kazoogon

2018/06/01 20:00

また「letとconstはif文内でしか読み込まない」。こちら勉強になりました、ありがとうございます。
guest

0

php

1//mainページに飛ぶようにし、login = trueという情報を送る 2 return view('main')->with([ 3 'login' => true, 4 ]);

とありますが、$loginに入る値は trueであって jsonの形式{'login' : true}ではないのではないでしょうか?おそらく下記のようにする必要があるのではないでしょうか?

php

1//mainページに飛ぶようにし、login = trueという情報を送る 2 return view('main')->with([ 3 'data' => [ 4 'login'=> true 5 ] 6 ]);

js

1const data = @json($data); 2console.log(data); // {'login': true}

【参考】https://styde.net/directiva-json-de-blade-en-laravel/


また、Javascript部分でこのようにしていますが、undefinedの時に var login = @json($login);
というのはおかしいのでは?undefinedでないときに値をセットするのであればわかりますが...

js

1if(typeof @json($login) == 'undefined'){ 2 var login = @json($login); 3}

投稿2018/05/30 16:33

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazoogon

2018/06/01 09:26

回答ありがとうございます。 ご指摘された部分は訂正いたしました、しかしまだ問題点がありましたので本文「回答を受けての追記」に追記させていただきました。 よろしくお願いいたします。
euledge

2018/06/01 10:20

if(data.login == true){}でVueのインスタンスの生成を切り替えるのは、正しくない方法だと思いますよ。他のところも後ほど見てみます。
euledge

2018/06/01 10:24

@json($login) ではなく $jsonを HTML上にレンダリング(<span>とかで)した場合はどのように表示されますか? (データが渡っているかと、どのような形式になっているかの確認です)
kazoogon

2018/06/01 10:49

{{$data}} を直接bladeファイルに記入すると「htmlspecialchars() expects parameter 1 to be string, array given 」と出ますね、これはdataの中にlogin => trueっていうデータが入っているのが原因だとは思いますが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問