前回のルートとコントローラで呼び出されたURLに対してPHPでのプログラム処理ができるようになりました。今回はここで実際にデータを集計して、結果を画面に表示したいと思います。この画面表示部分がMVCモデルのV(View)です。Laravelの標準テンプレートエンジンはBladeとなっています。それでは早速コントローラの実装です。前回の実装ではLaravelのようこそ画面を呼び出していましたが、今回は”top”とう名前のテンプレートを使用して画面を表示するようにします。テンプレートファイルは後で作成します。app/Http/Controllers/TopController.phpファイルを編集します。$students);}}モデルScoreに追加した2つのメソッドを呼び出して得点に関するデータを取得しています(ソースは後ほど)。$daysには試験実施日の一覧が、$scoresには試験の点数データが入ってきます。$subjectsでは科目一覧を取得しています。$studentsは配列として定義していて、続くforeachで点数データ列挙しながら二次元配列を作成します。一次元目に生徒名、二次元目に科目ID、その値として点数を設定しています。view(‘top’)で画面を呼び出すと同時に、topテンプレート内で使用するデータを->with()で指定しています。(->with()の複数回の呼び出しは、一回の->with()の呼び出しに置き換えることができます。その場合、->with()の引数にはキー、バリューの配列を設定します)実装の先頭で$request->input(‘day’)を使っています。コントローラメソッド(ここでいうindex())ではメソッドインジェクション(依存注入機能)を使ってRequestクラスのインスタンスを取得することができ、ユーザーリクエストの内容を利用できます。次はScoreにメソッドを追加します。app\Score.phpを編集しましょう。$scores;}}getDays()では試験日フィールドexam_dayをグルーピングして、日付の昇順に並び替えた結果を取得しています。exam_dayフィールドは時間まで入っているので、日付だけの書式に書き換えて配列に置き換えています。JOINで科目と生徒を連結した結果を返します。さあ、ここまでくるとあとはビューを作成します。resource/views/welcome.blade.phpをコピーしてresource/views/top.blade.phpを作成し、中身を編集します。呼び出していましたが、Laravelではこれでresource/viewsフォルダにあるtop.blade.phpの呼び出しと判断してくれます。sheet」を表示します。その下には試験日の一覧$daysを@foreachで列挙して表示します。各試験日はaタグでリンクを作成し、クリックするとその日の表示に切り替わるようにしています。‘TopController@index’)->name(‘top’);と指定した名前ですね。これによりこのリンク先が。最後にtableタグで点数表を表示します。縦に生徒軸、横に科目軸を設定して、各生徒の点数を表示するようにしています。それぞれ@foreachでループしながらテーブルを生成しています。これで実装が完了しました。実際に画面を表示して見ましょう。表示するデータはシーダーで用意したデータです。こんな感じで画面が表示されます。@breakなどの制御構文が使えます。テンプレートの継承や@includeなど、他のテンプレートファイルと組み合わせて1つの画面を作成することができます。同じ内容を複数のファイルに書くと、後からの編集が大変ですね。その手間をなくすために積極的に活用しましょう。PHPVuexの値の更新を監視したい福岡拠点の宮里です。vueのコンポーネントからvuexの値の更新を監視して、vuexの値の更新があったときにローカルのデータを更新したい場合どうすればいいの?と調べることがあったので備忘録として記事を書きます。vuexの日本語ドキュメントを読みました。vuexのStoreインスタンスメソッド’watch’が良さそうです。Functionfnが返す値をリアクティブに監視し、値が変わった時にコールバックを呼びます。fnは最初の引数としてストアのステートを、2番目の引数としてゲッターを受け取ります。vm.$watchメソッドと同じオプションをオプションのオブジェクトとして受け付けます。(vuex.vuejs.orgより引用)うーん、vue.jsに慣れてないので上記の説明を読んでもよくわかりません。store.watch()で引数に関数を渡して、関数の引数に監視したいstateの値を指定するみたいです。store.watch’で検索するとそれっぽい参考になりそうなコードがいくつか。イメージはつかめてきたものの、ただ今回は、複数に分割したストアのモジュールのローカルステートを監視したかったので、mapGettersやmapStateで実際どう書けばいいのと悩むこと数十分。_)m四苦八苦しつつもなんとかこのかたちに落ち着きました。this.$store.watch()の第一引数にステート/ゲッター、どちらを渡してもうまくいきそうです。今回はルートとコントローラーを追加します。ブラウザでURLリンクをクリックしたときにはそれに対応した画面が表示されますが、Webサーバー内ではそのURLに対して表示するデータをモデルから取得し、そのデータをビューで整形してHTMLとして表示します。このモデルとビューの橋渡し役がコントローラーの役目となります。要求されたURLをどのコントローラーで処理させるかを指定したのがルート(ルーティング)です。ルートから指定していきます。laravelプロジェクトのrouteフォルダにweb.phpがあります。これを開いて次のように編集しましょう。'TopController@index')->name('top');アプリケーションのトップURL(http://server/)が呼び出されたときに、TopControllerクラスのindexメソッドを呼び出すように指定しています。->name(‘top’)でこのルートに対して名前を付けています。ここでつけた名前は他の場所でURIを指定するときに使うことができます。次はTopControllerの作成です。シェルで次のコマンドを実行します。TopControllerするとapp/Http/Controllers/TopController.phpにファイルが作成されます。クラスメソッドとしてindex()を追加してあげましょう。view('welcome');}}route\web.php内で直接指定していたようこそ画面の表示を、コントローラーを介して表示するように変更しただけのものですが、このようにしておくことでビュー(ここではようこそ画面)で表示したいデータをphpプログラムで集めて、計算して、整形して表示することができるようになります。make:controllerコマンドではオプションは指定していませんでしたが、–model=[Model]や–resourceオプションを指定することで、リソースコントローラを作成することができます。destroy()の名前が付いた空のメソッドが一緒に作成されます。Studentモデル用のリソースコントローラを作成するにはこう書きます。StudentControllerまた、リソースコントローラを使う場合はroute/web.phpのルート指定を次のようにすることで、URIとアクションが自動的に割り付けられたルーティングが完成します。'StudentController');Route::resource()の1行で次のルーティングが完成します。Delete)管理がはかどるでしょう。リソースコントローラの考え方は他のWebフレームワークでも同様に使われています。...」コマンドが使えて同じようなルートを生成してくれますし、CakePHPでもルート指定時にまとめて設定してくれる方法があります。これらからLaravelに来た人にとってはわかりやすいですよね。PHP[Laravel]シーダーお久しぶりです。