Laravelのビューにデータを渡すには、viewヘルパ関数の引数にビューとデータをセットして返すようにしますが、これでは特定のビューにしかデータを渡せないので、今回はビューコンポーザを利用して、ビュー全体にデータを共有するための共通変数を設定して渡す方法をご紹介!
共通変数を設定するメリット
冒頭でも記述した通り、コントローラでフォームやデータベースなどから取得したデータをビューで表示するのが一般的ですが、ユーザー情報やマスターデータなど、ヘッダやサイドバーなどに固定的に表示したいデータがある場合、毎回アクションメソッドで設定するのは現実的ではありません。
ビュー全体に共通のデータを渡すメリットは、1箇所でビュー全体にデータを共有するための共通変数を設定してあげれば、あらゆる箇所でコーディングの手間が省け、ミスの防止にも繋がります。
どのような場合に使うのか?
常にビューで使うデータとして代表的なものは、ユーザー情報ですね!
あなたもヘッダーやサイドバー等に、現在ログインしているユーザー名を表示したりしませんか?
それと同じように、特定のデータを常時表示したいシチュエーションがあると思います。
例題として、ログインした各ユーザー毎に登録した特定のデータをビュー全体に渡します。
ここでは、認証ユーザー(user)のテーブルとは別に、記事の投稿テーブル(post)にデータがあると仮定して進めます。
ビューコンポーザを使う
ビュー全体にデータを共有するための変数の設定方法は、コントローラやミドルウェアなど昔からいくつか存在しますが、ここではLaravelの公式サイトに従って、AppServiceProviderのboot()メソッド内で、ビューコンポーザ(view()->composer)を使用します。
特に別途ServiceProviderは追加しまてん!
ビュー全体に共有する変数を作成
それでは、ビューコンポーザ(view()->composer)を使って、認証ユーザーが投稿した記事でのデータをビュー全体に共有する共通変数に設定していきましょう。
もちろん、事前にPostモデルを作成していて、CRUDできることが大前提です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use App\Post; class AppServiceProvider extends ServiceProvider { ・・・ public function boot() { //compose all the views.... view()->composer('*', function ($view) { //...with this variable $view->with('posts', Post::where('user_id', auth()->id())->get()); }); } } |
boot()メソッドの中を1行ずつ解説していきます。
まず、最初のview()->composerの第一引数ですが、こちらには共有したビューの名称を設定します。
例えば、ダッシュボードのビューにデータを共有したい場合は、以下のように設定します。
1 2 |
// dashboard.blade.phpにデータを共有する場合 view()->composer('dashboard', function ($view) {・・・}); |
複数のビューに共有したい場合は配列で指定します。
また、ワイルドカードも使用できますので、今回のようにビュー全体に共有したい場合は「*(アスタリスク)」で表現します。
1 2 |
// ビュー全体(*.blade.php)にデータを共有する場合 view()->composer('*', function ($view) {・・・}); |
Laravelの公式サイトでは、Viewファサードを名前空間で定義して、以下のように設定していましたが、特にどちらが正解というわけではではありませんが、コード量は少ない方が良いかと。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php namespace App\Providers; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; use App\Post; class AppServiceProvider extends ServiceProvider { ・・・ public function boot() { //compose all the views.... View::composer('*', function ($view) { //...with this variable $view->with('posts', Post::where('user_id', auth()->id())->get()); }); } } |
次に、普通にLaravelのクエリビルダ等を使用して取得したデータを、$view->with()メソッドで上記で指定したビューにpostsという変数で共有する設定をします。
1 |
$view->with('posts', Post::where('user_id', auth()->id())->get()); |
これでビュー全体にデータを共有できました!
それでは共有したデータを利用してビュー内で表示してみましょう。
ビューで変数を利用する
ビューで表示する方法は、一般的にコントローラ渡したデータを利用する方法と同じです。
例えば、認証ユーザーが投稿した記事数を表示してみます。
1 |
現在の投稿数:{{ count($posts) }}記事 |
また、取得するカラムも指定していませんので、そのままデータを表示することもできます。
1 2 3 4 5 6 |
@foreach($posts as $post) <tr> <th>{{ $post->title }}</th> <td>{{ $post->content }}</td> </tr> @endforeach |
view()->shareメソッドを使わない理由
最後に、ここまで読んだLaravelの有識者の中には、view()->shareメソッドを使えば良いじゃん!と思った方もいると思います。
しかし、以下の理由でview()->shareでは認証ユーザー情報を利用できないので、例えば、auth()->checkでユーザーがログインしているか判定することができなかったので苦労しました。
認証済みユーザは、ご紹介したview()->shareメソッドでは共有できません。
引用:Laravelで全ページ共通の変数を設定したい時はview shareが便利 | 40代からプログラミング!
理由は、bootメソッドはauth()->user()が初期化されて使えるようになる前に実行されてしまうからです。
以上です!
利用方法によってはかなり便利なので、ぜひ使ってみてください!
コメント