☝️

LaravelのBlade間で共通の変数を使う

2024/02/01に公開

Laravelを使ってて、HTMLのパーツをViewのBladeファイルで使いまわしたいときありますよね。
例えば、メニューの項目やカテゴリー項目をヘッダーとフッターで使いたいとか。
header.blade.phpとfooter.blade.phpに分かれてて、layout.blade.phpで読み込んでるよと言った場合、面倒なので同じものを呼び出すときは、全部のbladeで同じ変数使いたいってなると思うんです。
そういう時に使うのが共通変数です。
色々方法はありますが、とりあえず簡単な方法で設定します。

ServiceProviderで設定

今回はデータベースのconfigsテーブルに登録されているサイトの各種データを呼び出すという前提で設定します。
共通変数名はsiteにしました。

app/Providers/AppServiceProvider.php

namespace App\Providers;

use App\Models\Config;
use Illuminate\Support\ServiceProvider;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\Facades\Schema;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Paginator::defaultView('default');

        if (Schema::hasTable('configs')) {
            $site = Config::latest()->first();
            if (!$site) {
                $site = new Config();
            }
            view()->share('site', $site);
        }
      }
}

Schema::hasTable() でテーブルが存在したらというif文を入れるのを忘れずに。
初期状態でテーブルができてないときにエラーになります。

viewで、{{ $site->site_name }} と呼び出すと、configsテーブルのsite_nameカラムの値が呼び出されます。
どのviewからでも使用できます。

ただ共通変数が増えると、ごちゃごちゃになりがちなので、その場合は専用のComposerとサービスプロバイダを別途作成するのをおすすめします。

Discussion