Posted at

laravel5.4のViewComposerで複数のViewで使用するデータをまとめる

More than 1 year has passed since last update.


やりたいこと

複数のViewで使うデータを一箇所でまとめて処理してViewに渡したい


手順

ViewComposerの説明はこちらの中程にあります。

ViewComposerはViewがレンダーされる時に呼び出されるので、それに情報を結合することができます。


ServiceProviderの作成

まずは以下のコマンドでServiceProviderを作成します。

php artisan make:provider ComposerSeriviceProvider

するとApp\ProvidersにComposerSeriviceProvider.phpができます。


App\Providers\ComposerSeriviceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerSeriviceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/

public function boot()
{
//
}

/**
* Register the application services.
*
* @return void
*/

public function register()
{
//
}
}



config\app.phpへ登録

作成したServiceProviderをconfig\app.phpの'providers'へ追記します。


app.php

'providers' => [

App\Providers\ComposerSeriviceProvider::class,
],


ViewComposerの作成

app/HttpにViewComposersディレクトリを作成し、そこにViewComposerを作成します。

ここに行いたい処理を書きます。


App\Http\ViewComposers\NameComposer.php

<?php

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;

class NameComposer {

protected $name;

public function __construct()
{
$this->name = 'bubbles';
}

/**
* Bind data to the view.
*/

public function compose(View $view)
{
$view->with('name',$this->name);
}
}



ViewComposerを適用したいテンプレートの指定

最後にComposerSeriviceProvider.phpを以下のように書き換えます。

今回はpage配下の全てのファイルを指定します。


App\Providers\ComposerSeriviceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
use App\Http\ViewComposers\NameComposer;

class ComposerSeriviceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/

public function boot()
{
View::composers([
NameComposer::class => [
'page.*',
]
]);
}

/**
* Register the application services.
*
* @return void
*/

public function register()
{
//
}
}


適用したいテンプレートが増えたら追記していけばOKです。

手順は以上です。


:writing_hand_tone1:('v')

ヘッダーやフッターやサイドバーで使用するデータといった、全ページまたは多くのページで共通して使用するデータは、ViewComposerでまとめるとコントローラーがすっきりして良いですね。