【Laravel】ビューコンポーザとは?

Laravel

Laravelの機能であるビューコンポーザについて、何だろう?と思ったので、調べたことを整理します。

ビューコンポーザとは?

コントローラーと切り分けてロジックを記述でき、ビューにデータを結合することができます。

LaravelではBladeでPHPを記述することができ、ロジックを記載することもできるが、MVCの概念的には好ましくないです。
とはいえ、コントローラーに記述すると記述量が増えて、いわゆるFat controllerになってしまいます。この問題を解決するための機能になります。

リクエスト→ルーティング→コントローラー→レンダリング→ビュー
の流れでいうと、レンダリングの処理に入り混み、必要な情報をビューに渡すことができます。

ビューコンポーザーはどうやってコントローラーに組み込まれるのか?については、サービスプロバイダが担っています。

サービスプロバイダについては、以前こちらの記事に少し記載しました。

リーダブルを要約すると、「Laravelのコアサービス(サービスコンテナの結合や、イベントリスナ、フィルター、それにルート)などを登録するLaravelの初期起動処理部分」だと思ってます。(リーダブルには「Laravel初期起動プロセス全体の最も重要な側面」との表現が有るくらい、大事な機能になるそうです)

また、リーダブルにはビューコンポーザーについて、「アプリケーション内の複数のルートかコントローラが同じビューを返し、常に特定のデータが必要な場合にきわめて役立ちます。」と記載されています。

・ビューコンポーザを使うことで、同じデータなのであれば、コントローラーの記述量を減らすことができる
・ビューコンポーザーを使うためには、サービスプロバイダを利用する

ことを把握した上で、使い方を見ていきます。

ビューコンポーザの使い方

サービスプロバイダを作る

コントローラーやモデルと同様、artisanコマンドで作成できます

php artisan make:provider HogeServiceProvider

以下のファイルができました。

ファイルは、app/Providers/HogeServiceProvider.php になります。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

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

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

config/app.phpに追加する

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        (以下続く)
        //新規追加
              Illuminate\Auth\HogeServiceProvider::class,

              ]

読み込まれるよう、登録します。

Composerのファイルを作る

artisanコマンドがないので、自分で作ります

<?php

namespace App\View\Composers;

use App\Repositories\UserRepository;
use Illuminate\View\View;

class HogeComposer
{
    /**
     * userリポジトリの実装
     *
     * @var UserRepository
     */
    protected $hoge;

    public function __construct()
    {
        // 依存関係はサービスコンテナによって自動的に解決される
        $this->hoge = $hoge::all();
    }

    /**
     * データをビューと結合
     *
     * @param  \Illuminate\View\View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('count', $this->hoge->count()); //仮に10とします
    }
}

サービスプロバイダにView::composerを記述

app/Providers/HogeServiceProvider.phpのboot関数に記述する

public function boot()
{
 View::composer(
 'hoge', 'App\Http\View\Composers\HogeComposer' 
 );
}

クラスを呼び出す書き方をしていますが、以下のように無名関数のコンポーザーを呼び出す書き方もできます。

//サンプル
 // クロージャベースのコンポーザを使用
        View::composer('dashboard', function ($view) {
            });

これらの設定をすると、hoge.blade.php だと $count 変数を取り出しでき、ビューコンポーザが利用できます。

app\resources\views\hoge.blade.php

<p>{$count}</p> //10と表示される

実際には

動きの説明を読んでいただくと、controllerを全く経由していないことがわかります。
そのため、個別の処理はビューコンポーザで書くべきではないと思います。

逆に、「この部分はお決まり」な箇所は1箇所の記述で使い回しができ、controllerの記述量を減らせるメリットを受けられる&変更対応に強くなるので、ヘッダーやメニューに使える機能であるかなと思います。

コメント

タイトルとURLをコピーしました