Laravelでは、View::share
を使うことで、すべてのビューで共通の変数を簡単に利用できます。
複数のビューにわたって同じデータを共有したい場合に便利です。
目次
view()->share
の基本的な使い方
すべてのビューで共有する
たとえば、AppServiceProvider
で共有したいデータをグローバルに設定する場合は次のようになります。
▼ AppServiceProvider.php
で
を記述。View::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
は使用できません。