Laravelで共通の変数を設定してビュー全体にデータを共有する

laravel-view-share
  • URLをコピーしました!

Laravelのビューにデータを渡すには、viewヘルパ関数の引数にビューとデータをセットして返すようにしますが、これでは特定のビューにしかデータを渡せないので、今回はビューコンポーザを利用して、ビュー全体データ共有するための共通変数を設定して渡す方法をご紹介!

目次

共通変数を設定するメリット

冒頭でも記述した通り、コントローラでフォームやデータベースなどから取得したデータビューで表示するのが一般的ですが、ユーザー情報やマスターデータなど、ヘッダやサイドバーなどに固定的に表示したいデータがある場合、毎回アクションメソッドで設定するのは現実的ではありません。

ビュー全体共通データを渡すメリットは、1箇所でビュー全体データ共有するための共通変数を設定してあげれば、あらゆる箇所でコーディングの手間が省け、ミスの防止にも繋がります。

どのような場合に使うのか?

常にビューで使うデータとして代表的なものは、ユーザー情報ですね!
あなたもヘッダーやサイドバー等に、現在ログインしているユーザー名を表示したりしませんか?
それと同じように、特定のデータ常時表示したいシチュエーションがあると思います。

例題として、ログインした各ユーザー毎に登録した特定のデータビュー全体に渡します。
ここでは、認証ユーザー(user)のテーブルとは別に、記事の投稿テーブル(post)にデータがあると仮定して進めます。

ビューコンポーザを使う

ビュー全体データ共有するための変数の設定方法は、コントローラやミドルウェアなど昔からいくつか存在しますが、ここではLaravelの公式サイトに従って、AppServiceProviderboot()メソッド内で、ビューコンポーザview()->composer)を使用します。
特に別途ServiceProviderは追加しまてん!

あわせて読みたい

ビュー全体に共有する変数を作成

それでは、ビューコンポーザview()->composer)を使って、認証ユーザーが投稿した記事でのデータをビュー全体に共有する共通変数に設定していきましょう。
もちろん、事前にPostモデルを作成していて、CRUDできることが大前提です。

boot()メソッドの中を1行ずつ解説していきます。
まず、最初のview()->composerの第一引数ですが、こちらには共有したビューの名称を設定します。
例えば、ダッシュボードのビューデータ共有したい場合は、以下のように設定します。

複数のビュー共有したい場合は配列で指定します。
また、ワイルドカードも使用できますので、今回のようにビュー全体に共有したい場合は「*(アスタリスク)」で表現します。

Laravelの公式サイトでは、Viewファサードを名前空間で定義して、以下のように設定していましたが、特にどちらが正解というわけではではありませんが、コード量は少ない方が良いかと。。

次に、普通にLaravelクエリビルダ等を使用して取得したデータを、$view->with()メソッドで上記で指定したビューにpostsという変数共有する設定をします。

これでビュー全体データ共有できました!
それでは共有したデータを利用してビュー内で表示してみましょう。

ビューで変数を利用する

ビューで表示する方法は、一般的にコントローラ渡したデータを利用する方法と同じです。
例えば、認証ユーザーが投稿した記事数を表示してみます。

また、取得するカラムも指定していませんので、そのままデータを表示することもできます。

view()->shareメソッドを使わない理由

最後に、ここまで読んだLaravelの有識者の中には、view()->shareメソッドを使えば良いじゃん!と思った方もいると思います。
しかし、以下の理由でview()->shareでは認証ユーザー情報を利用できないので、例えば、auth()->checkでユーザーがログインしているか判定することができなかったので苦労しました。

認証済みユーザは、ご紹介したview()->shareメソッドでは共有できません。
理由は、bootメソッドはauth()->user()が初期化されて使えるようになる前に実行されてしまうからです。

引用:Laravelで全ページ共通の変数を設定したい時はview shareが便利 | 40代からプログラミング!

以上です!
利用方法によってはかなり便利なので、ぜひ使ってみてください!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次