PHP
Web
laravel5.4

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

やりたいこと

複数の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でまとめるとコントローラーがすっきりして良いですね。