例えば。
作っているサイトには全ページに常にサイドバーがあり、そこに最新のブログ記事(ここでは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リクエストだけにするなら他に良い場所があるのかも。
コメント