【Laravel】ビューコンポーザを使ってビューのロジックを分離する

こんにちは、技術部のUです。今回はLaravelでビューコンポーザを使ってビューのロジックをコントローラーから分離する方法についてです。

ビューコンポーザとは

ReaDoubleでは以下のように説明されています。

ビューをレンダーするときに呼び出すコールバックまたはクラスメソッドです。ビューをレンダーするたびにビューへ結合するデータがある場合、ビューコンポーザを使用すると、そのロジックを1つの場所に集約できます。

つまり、ビューを表示する際のビジネスロジックをコントローラから分離して記述することができます。
共通するデータを複数ページで表示したい時等にビューコンポーザを使うとファットコントローラ改善に役立ちます。ヘッダーやサイドナビなどの共通レイアウトにデータを渡したい時などに役立ちます。

今回はヘッダーとプロフィールにログインユーザー情報を渡す想定で進めます。

実装手順

以下のような手順で実装を進めていきます。

①ServiceProviderを準備
②config/app.phpに登録
③Composerクラスを作成
④ServiceProviderへ設定
⑤設定した値をbladeで使用

①ServiceProviderを準備

$ php artisan make:provider ViewComposerServiceProvider を実行して、ServiceProviderを作成します。

ViewComposerServiceProvider.php

				
					<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ViewComposerServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}
				
			

②config/app.phpに登録

作成したServiceProviderをconfig/app.phpに登録します。

				
					'providers' => [
	App\Providers\ViewComposerServiceProvider::class, // 追加
  ],
				
			

③Composerクラスを作成

下記コマンドを実行してapp/Http/View/Composers配下にUserComposer.phpを作成します。

				
					$ mkdir -p  app/View/Composers && cd "$_"
				
			
				
					$ touch UserComposer.php
				
			
作成したUserComposer.phpを以下のように編集します。
				
					<?php

namespace App\Http\View\Composers;

use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;

class UserComposer
{
  /**
   * データをビューと結合
   *
   * @param  \Illuminate\View\View  $view
   * @return void
   */
  public function compose(View $view)
  {
    $view->with('user', Auth::user());
  }
}
				
			

④ServiceProviderへ設定

①で作成したViewComposerServiceProvider.phpに以下のように追記します。
				
					<?php

namespace App\Providers;

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

class ViewComposerServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        // header.blade.php と profile.blade.php にUserComposerで結合した$userが常に渡される
        View::composer(['header', 'profile'], 'App\Http\View\Composers\UserComposer');
    }
}
				
			

⑤設定した値をbladeで使用

ヘッダーとプロフィールのbladeで $user を利用するように変更します。

これでコントローラからビューにログインユーザー情報を渡さなくても表示できるはずです。

さいごに

簡易的ではありますが、ビューコンポーザについて書かせていただきました。
少しでもお役に立てれば幸いです。
Laravelを使う上でコントローラの肥大化防止は逃げられない課題だと思いますので、適宜利用していければと思います。
最後までお読みいただきありがとうございました。

スーパーソフトウエアの採用情報

あなたが活躍できるフィールドと充実した育成環境があります

blank
blank