[Laravel] 全てのページで同じデータを表示したいときの効率的な方法

スポンサーリンク

例えば。
作っているサイトには全ページに常にサイドバーがあり、そこに最新のブログ記事(ここではPostモデルとします)の5件のリンクを貼るとします。

全てのコントローラーでPostモデルへの同じ取得クエリを書くのは非効率的なので、どうにかしてまとめたい。

そんな時に使えるのがView::share()です。
これをとりあえずAppServiceProviderのbootメソッドに記載することで全てのビューに渡す変数が作成できます。

app/Providers/AppServiceProvider.php

<?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リクエストだけにするなら他に良い場所があるのかも。

スポンサーリンク

シェアする

フォローする