Laravel

Laravelでviewに共通の変数を渡す方法【View Composers / View Creators】

ヘッダーやサイドバーなどのメニューに全ページ共通の変数を入れたいということがあると思います。
Laravelの場合は全てのページのコントローラにそれぞれ書かなくても、View Composersという機能により簡単に共通変数を渡したり管理することができます。

動作確認環境はLaravel 8です。

参考:https://laravel.com/docs/8.x/views#view-composers日本語

Middlewareなどでもやろうと思えばやれますが、上記公式の通りViewのことならView Composersに任せるのが通常です。
変なところでやると後で困ることになるので、特別な理由がない限りviewのことならこちらで対応しましょう。

まず処理を記述するcomposerを作成します。(公式では先にProviderを作成しています。どちらでもよいです。)
app/Http/View/Composers/XxxxxComposer.php
ファイル名もパスも自由ですが、上記のようにパスは公式と合わせておくとわかりやすいです。
ファイル名はProfileComposer.phpやHeaderMenuComposer.php、管理画面だけで利用するならAdminComposer.phpのように何のための値をいれているものか分かるようにしておくとよいでしょう。

公式ではconstructorなども定義していますが、必須はcompose()のみです。後述のView::composer()でここが実行されます。
$view->with(key, value); で定義していきます。
以下はlogin_userにログインユーザーのデータを割り当てる例です。

<?php

namespace App\Http\View\Composers;

use Auth;
use Illuminate\View\View;

class XxxxxComposer {

	/**
	 * Bind data to the view.
	 *
	 * @param  \Illuminate\View\View  $view
	 * @return void
	 */
	public function compose(View $view) {
		$view->with('login_user', Auth::guard()->user());
	}

}

次に、Providerを作成します。
$ php artisan make:provider ViewServiceProvider で
app/Providers/ViewServiceProvider.php
が生成されます。
こちらもファイル名は自由ですが、特に変える必要もなく公式と合わせるのがわかりやすいかと思いますのでここでは公式と同じでいきます。

<?php

namespace App\Providers;

use App\Http\View\Composers\XxxxxComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider {

	/**
	 * Register any application services.
	 *
	 * @return void
	 */
	public function register() {
		//
	}

	/**
	 * Bootstrap any application services.
	 *
	 * @return void
	 */
	public function boot() {
		View::composer('*', XxxxxComposer::class);
	}
}

上記のように記述することで全てのviewにXxxxxComposerを適用できます。
View::composer('*', XxxxxComposer::class);
が'*'となっているので全てのビューが対象となりますが、この部分を'admin.*'に変更すればadmin以下のビューを対象とすることもできます。(admin/*でも大丈夫なようです)

最後に、作成したProviderを登録します。
config/app.php を開き、providersに\App\Providers\ViewServiceProvider::class,を追記します。

    'providers' => [
        ...
        \App\Providers\ViewServiceProvider::class,
    ],

これにて設定は完了です。

View::composer()をView::creator()、compose()をcreate()に書き換えるとビューがインスタンス化された直後に実行されるビュークリエータになります。
viewの読み分けなどをするならこちらになります。

なお、試してみたところ同名のパラメータが設定されていた場合、テンプレートに出力される値は
View::composer > View::creator > view呼び出し時の引数(Controller)
の順で優先されるようです。
新たにView Composers / View Creatorsを設定する際は既存の変数を上書きしないようにお気をつけください。

-Laravel