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

2022/10/27に公開

はじめに

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

ビューコンポーザとは

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

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

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

参考

https://readouble.com/laravel/8.x/ja/views.html

実装手順

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

  • ①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に登録します。

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を以下のように編集します。

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に以下のように追記します。

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を使う上でコントローラの肥大化防止は逃げられない課題だと思いますので、適宜利用していければと思います。
最後までお読みいただきありがとうございました。

Discussion