WEBOPIXEL

LaravelのViewComposerでViewで使用する共通のデータを設定する

Posted: 2017.09.08 / Category: PHP / Tag: 

Laravelでサイドバーなどすべてのページで共通するデータを表示したいときはViewComposerを使用すると便利です。

Sponsored Link

Laravel 5.4を使用しています。

ComposerServiceProviderの作成

最初にapp/Providers/ComposerServiceProvider.phpを作成します。

例えばViewに$hogeという変数で「hogehoge」と表示させたい場合は下記のようにします。

app/Providers/ComposerServiceProvider.php

<?php
namespace App\Providers;

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

class ComposerServiceProvider extends ServiceProvider
{
	public function boot()
	{
		View::composer('*', function($view) {
			$view->with('hoge', 'hogehoge');
		});
	}
}

View::composerの第一引数に表示するViewを指定します。

‘*’ すべてのView
‘layouts/app’ layouts/app.blade.phpを使用しているView
[‘posts/*’,’tags/*’] posts、tagsディレクトリ内のView
配列にすることで複数の指定したViewで使用できます。

providersにComposerServiceProviderの登録

作成したComposerServiceProviderconfig/app.phpprovidersに登録します。

config/app.php

'providers' => [
	// ・・・
	App\Providers\ComposerServiceProvider::class,
],
	

これでViewで使用することができます。
指定したViewで$hoge変数が展開できるはずです。

ViewComposerをクラス化して外部ファイルにする

設定するViewComposerが多くなるとComposerServiceProviderクラスが肥大化してしまいます。
クラス化して外部ファイルにする方法をご紹介します。

ファイルを作成する場所は任意の場所で大丈夫ですが、ここではapp/Http/ViewComposersに作成します。

app/Http/ViewComposers/HogeComposer.php

<?php
namespace App\Http\ViewComposers;
	
use Illuminate\View\View;

class HogeComposer
{
	/**
	* @var String
	*/
	protected $hoge;
	
	public function __construct()
	{
		$this->hoge = 'hogehoge';
	}
	
	/**
	* Bind data to the view.
	* @param View $view
	* @return void
	*/
	public function compose(View $view)
	{
		$view->with('hoge', $this->hoge);
	}
}

あとはComposerServiceProvider.phpを下記のように変更します。

app/Providers/ComposerServiceProvider.php

<?php
namespace App\Providers;

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

class ComposerServiceProvider extends ServiceProvider
{
	public function boot()
	{
		View::composer('*', 'App\Http\ViewComposers\HogeComposer');
	}
}
参考サイト
ビュー 5.4 Laravel – ビューコンポーザ

LEAVE A REPLY

コードを書く場合は<pre>で囲んでください。