【Laravel】View::shareですべてのビューに共通の変数を設定

【Laravel】View::shareですべてのビューに共通の変数を設定

Laravelでは、View::shareを使うことで、すべてのビューで共通の変数を簡単に利用できます。

複数のビューにわたって同じデータを共有したい場合に便利です。

view()->shareの基本的な使い方

すべてのビューで共有する

たとえば、AppServiceProviderで共有したいデータをグローバルに設定する場合は次のようになります。

AppServiceProvider.phpView::shareを記述。

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;

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

    /**
     * Bootstrap any application services.
     */
    public function boot()
    {
        // 共有データを設定
        View::share('appName', 'My Laravel App');
    }
}

▼ Bladeテンプレートで共有データを使用。

<!-- resources/views/welcome.blade.php -->
<html>
    <head>
        <title>{{ $appName }}</title>
    </head>
    <body>
        <h1>Welcome to {{ $appName }}!</h1>
    </body>
</html>

コントローラからView::shareを使う

コントローラ内でView::shareを呼び出してデータを設定することも可能です。

▼ コントローラ内

namespace App\Http\Controllers;

use Illuminate\Support\Facades\View;

class SampleController extends Controller
{
    public function index()
    {
        // 全てのビューにデータを共有
        View::share('globalVar', 'Shared from Controller');

        return view('sample');
    }
}

▼ Bladeテンプレート

<!-- resources/views/sample.blade.php -->
<h1>{{ $globalVar }}</h1>

複数の値を共有する

複数の値を同時に共有するには、配列を使います。

▼ サービスプロバイダ

public function boot()
{
    View::share([
        'appName' => 'My Laravel App',
        'version' => '1.0.0',
    ]);
}

▼ Bladeテンプレート

<footer>
    <p>{{ $appName }} - Version {{ $version }}</p>
</footer>

変数やオブジェクトも共有できる

▼ サービスプロバイダ

use App\Models\User;

public function boot()
{
    $adminUser = User::where('role', 'admin')->first();
    View::share('admin', $adminUser);
}

▼ Bladeテンプレート

<p>Admin: {{ $admin->name }} ({{ $admin->email }})</p>

特定のビューだけで共有する場合

特定のビューだけにデータを渡したい場合はView::composerを使います。

▼ サービスプロバイダ

public function boot()
{
    // welcome.blade.php にのみデータを共有
    View::composer('welcome', function ($view) {
        $view->with('pageTitle', 'Welcome Page');
    });
}

▼ Bladeテンプレート(welcome.blade.php)

<!-- resources/views/welcome.blade.php -->
<h1>{{ $pageTitle }}</h1>

この場合、ほかのビューでは$pageTitleは使用できません。