【Laravel】ビューコンポーザとは:共通するデータをViewに渡す方法

2023.10.26 /

【Laravel】ビューコンポーザとは:共通するデータをViewに渡す方法

記事ではPHPフレームワークのLaravelにおける、ビューコンポーザについて詳しく解説していきます。

ビューコンポーザとはレンダリング時にデータをViewに提供するクラスです。コントローラーの肥大化を防ぎ、データ関連のロジックをコントローラーから分離することができます。共通するデータをViewに渡す処理として利用されます。

中規模・大規模のWebアプリケーションでビューの管理を効率的に行うために必須の機能です。

ぜひ本記事を通して、ビューコンポーザの使い方などについて理解を深めてください。

ビューコンポーザ(View Composer)

ビューコンポーザ(View Composer)とは

ビューコンポーザとはビューをレンダリングする際にビューにデータを提供するクラスです。簡単に言うと特定のページを表示する際に自動的に実行される処理を設定できるということです。

Laravelの用語確認

レンダリングとはテンプレートに記述されている変数や処理に必要な情報をはめ込み、実際の表示を生成することを意味します。レンダリングはテンプレートエンジンによって行われます。Laravelにはテンプレートエンジンとして「Blade」が備わっています

ビューコンポーザで定義したデータを複数のビューで利用することができ、ビューで共通して利用するデータのロジックをコントローラーから分離することができます。この特徴はビューとコントローラーの役割を理解している必要があります。以下にそれぞれの役割を記します。

機能 役割
コントローラー
  • ユーザーのリクエストを処理して、ロジックを実行する
  • データを取得・生成してビューに渡す
ビュー
  • ユーザーに表示される画面(HTML)を作成
  • コントローラーから渡されたデータも使ってHTMLを生成

関連リンク:【Laravel】コントローラーとは

ビューコンポーザはコントローラーが担っていたデータ処理(データを取得・生成してビューに渡す役割)を行うということです。これによりコントローラーからはデータ処理の部分を切り離すことができるのです。

POINT

主な用途として、複数のページで共通するサイドバーやナビゲーションバーで表示するデータをビューコンポーザで一元管理することが多いです

コントローラーにロジックを記入してビューに渡すことはできますが、それだとコントローラーのコードが増加(Fat Controller)してしまいます。

ビューに特化したデータはコントローラーから分離してビューコンポーザに集約することで、コントローラーのコードを少なくしてコードの可読性を向上できます。

複数のビューで利用するロジックや変数があればビューコンポーザでまとめるような利用方法が主になります。

私の場合

メニューやヘッダーなどすべてのページで共有利用するビューのデータに対して利用することが多いです

ビューコンポーザの使用方法

Laravelによるアプリケーションでビューコンポーザを使用する流れは以下の通りです。

  1. ビューコンポーザクラスの作成
  2. サービスプロバイダの作成
  3. サービスプロバイダの登録
  4. ビューでビューコンポーザクラスから渡されたデータを使用

それぞれの操作について次項より詳しく解説していきます。

ビューコンポーザクラスの作成

まずビューコンポーザを作成していきます。ビューに提供するデータに関する処理をクラスとして定義します。

ビューコンポーザはartisanコマンドによる自動生成はできないため、手動でファイルの作成およびコードの記述を行います。

ビューコンポーザはHttp内であればどこに作成しても問題ありません。
ここでは「app/Http/View/Composers」を作成してその中にビューコンポーザを作りましょう。ここではMenuComposer.phpを以下の通りに作成します。

// app/Http/View/Composers/MenuComposer.php
<?php

namespace App\Http\View\Composers;

use Illuminate\View\View;

class MenuComposer
{
    public function compose(View $view)
    {
    $data = [
            'key1' => 'data1',
            'key2' => 'data2',
        ];

    $view->with('data', $data);
    }
}

クラス内ではcomposeメソッドを定義し、引数にViewクラスのインスタンスを指定します。

ビューに変数を渡すためにwithメソッドを使っています。上記では$dataをビューに変数dataという名前で渡しています。

構文

$view->with('変数名', '値');

サービスプロバイダの作成

ビューコンポーザを利用するためにサービスプロバイダを使う必要があります。サービスプロバイダを作成するには以下構文に沿ってartisanコマンドを実行します。

構文

php artisan make:provider サービスプロバイダ名

ここでは以下コマンドを実行してMenuServiceProviderを作成します。

$ php artisan make:provider MenuServiceProvider

上記コマンドを実行すると「app/Providers」内にMenuServiceProviderが作成されます。中を開くと次のように記述されています。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class MenuServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     */
    public function register(): void
    {
        //
    }

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

上記コードからわかるように、サービスプロバイダはServiceProviderクラスを継承します。

サービスプロバイダーにはregisterメソッドとbootメソッドの2つの重要なメソッドがあります。

メソッド 説明
register() サービスコンテナにサービスをバインドする。アプリケーソンの起動プロセスの初期段階で実行される
boot() サービスが起動した後に実行する処理を記述する

ここではbootメソッドを使用します。bootメソッドには次のように記述してください。

// 追加する
use Illuminate\Support\Facades\View;

public function boot() {
// 以下を追加
    View::composer(
        'index','App\Http\View\Composers\MenuComposer'
    );
}

View::composerがビューコンポーザの設定を行うメソッドであり、第一引数にデータを渡すblade、第二引数にビューコンポーザクラスを指定します。

構文

View::composer('データを渡すbladeファイル','ビューコンポーザクラス');

注意点

Viewファザードを利用するために以下コードを追記してください

use Illuminate\Support\Facades\View;

サービスプロバイダの登録:app.phpのproviders配列

サービスプロバイダを作成したら、それらが実行されるようにサービスプロバイダを登録します。

サービスプロバイダを登録するために「config/app.php」を開き、以下のように作成したサービスプロバイダを追加します。

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

ここまでの操作によって、指定したビュー内でビューコンポーザから渡されるデータが利用できます。

ビューでビューコンポーザクラスから渡されたデータを使用

Bladeでは以下のようにビューコンポーザクラスから渡されたデータを利用することができます。

<p>{{ $data['key1'] }}</p>
<p>{{ $data['key2'] }}</p>

まとめ

本記事「【Laravel】ビューコンポーザとは:共通するデータをViewに渡す方法」はいかがでしたか。

以下にビューコンポーザのまとめを記します。

ビューコンポーザのまとめ
  • ビューコンポーザはビューがレンダリングされるたびに呼び出されるクラスメソッド
  • ビューコンポーザの利用でビューで共通して利用するデータのロジックをコントローラーから分離できる
  • コントローラーの可読性が向上する
  • ビューコンポーザの利用にはサービスプロバイダの作成・登録が必要

まだビューコンポーザを利用したことがない方は、ぜひ本記事を参考にして利用してみてください。