Laravelですべてのビューページで共通して使える変数を設定するには、viewファサードのshareメソッドが便利です。
ただ、これを設定した後にエラーが発生するケースもあります。
わたしが実際、経験しました。
エラーの回避方法とともに、view shareの設定方法をコードと共に解説していきますね。
Laravelで全ページ共通の変数を設定する方法
たとえば、postsテーブルの内容を$posts変数に代入して、この$posts変数を全ページで使いたいとします。
app/Providers/AppServiceProvider.php を開きます。
ファイルの上部に、下記のuse宣言を加えておきます。
【AppServiceProvider.php】
1 |
use App\Models\Post; |
public function boot () に下記コードを入れます。
【AppServiceProvider.php】
1 2 3 4 5 6 |
public function boot() { $posts=Post::all(); view()->share('posts', $posts); } |
これだけで、すべてのビューページで $posts 変数が使えるようになります!
頻繁に使う変数であれば、毎回メソッドで変数を定義するのは面倒ですよね。
そういった時に、ご活用ください。ただ、注意点があります…
ロールバックしたときにエラーになる
ロールバックして該当テーブルを削除した後はエラーになるので、注意してくださいね。
先程の例でいえば、postsテーブルをロールバック等で削除してしまうと、$posts変数が定義できなくなり、ページを表示しようとするとエラーになります。
postsテーブルを再度作成するとエラーは元に戻ります。
エラーを避けるには、ロールバック前に view()->share を無効にしておくと良いですよ。
view()->shareメソッドでは、認証済みユーザーは設定できない
全ビューページで共通して使う変数としては、認証済みのユーザが最も需要があるかと思います。
ただ認証済みユーザは、ご紹介したview()->shareメソッドでは共有できません。
たとえば次のようなコードを入れると、「Trying to get property ‘name’ of non-object」エラーになります。
【AppServiceProvider.php】
1 2 3 4 5 |
public function boot() { $user=auth()->user(); view()->share('user', $user); } |
理由は、bootメソッドはauth()->user()が初期化されて使えるようになる前に実行されてしまうからです。
こういった時の対処法は別の記事で解説しているので、ご興味があれば併せて読んでくださいね。