例えば。
作っているサイトには全ページに常にサイドバーがあり、そこに最新のブログ記事(ここではPostモデルとします)の5件のリンクを貼るとします。
全てのコントローラーでPostモデルへの同じ取得クエリを書くのは非効率的なので、どうにかしてまとめたい。
そんな時に使えるのがView::share()です。
これをとりあえずAppServiceProviderのbootメソッドに記載することで全てのビューに渡す変数が作成できます。
app/Providers/AppServiceProvider.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\View; // Viewファサード追加 use App\Models\Post; // 使用するモデルをuse class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { // これを追加 View::share('posts', Post::orderBy('id', 'desc')->limit(5)->get()); } } |
こんな感じでAppServiceProviderのboot内にView::shareを書いておくと、全てのビュー内で変数postsが使用できるようになります。
当然shareの第1引数は好きな名前に、第2引数は好きな値に変えられます。
追記。
この方法を使うとHTTPリクエスト以外にも全てのArtisanコマンドなどでbootの中身が実行されるみたいです。
例えばdocker-composeでDBより先にartisan serve起動するとエラーになったりします。(restart: alwaysで一応誤魔化せる)
HTTPリクエストだけにするなら他に良い場所があるのかも。