【Laravel / グローバル変数】どのViewでも使用できる共通変数を設定する

えびさん

カテゴリ情報やマスタ情報のような、複数のviewで繰り返し使用したい変数は
view()->share()でシェアしてあげる

どうやって共有するか

Laravelが用意してくれているview()->share('変数名', '入れたい値')を使用することで
簡単に共通変数を設定可能

view()->share()をどこで呼び出す?

Middlewareを作ったりいろんな方法があるけど、
さくっと作りたかったのでapp/Providers/AppServiceProvider.phpで設定した

共通変数に文字列を設定してみる

  • app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

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

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $commonValue = '共通で使用したい値'; // ⭐️ 追加
        view()->share('commonValue', $commonValue); // ⭐️ 追加
    }
}

これで、どのviewでも$commonValue変数が使用できるようになった

共通変数にテーブルの取得情報を設定してみる

例えばcategoriesテーブルの値を設定したい場合

  • app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Models\Category; // ⭐️ 追加
use Illuminate\Support\Facades\Schema; // ⭐️ 追加

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

    /**
     * Bootstrap any application services.
     *
     * @param UrlGenerator $url
     * @return void
     */
    public function boot(UrlGenerator $url)
    {
        // ⭐️ 追加
        if (Schema::hasTable('categories')) {
            $categories = Category::all();
            view()->share('categories', $categories);
        }
    }
}

これでどのviewでも$categoriesが使用できる

解説

AppServiceProviderのbootメソッドは、アプリケーションの初期起動時に呼び出される
そのためここにview()->share()を書いてあげると、
全Viewで変数が使用可能になる

※上記のようにテーブルを使用する場合は、migration前だとエラーが出てしまうので
if (Schema::hasTable('categories')) {}
でテーブルが存在する場合のみ実行するようにしている

複雑な処理とかをしたい場合は専用のサービスプロバイダを作る方が良き

使ってみる

\ Controllerから渡すのと同じ要領で使用できる /

@foreach ($categories as $category)
  {{ $category->name }}
@endforeach