本記事では、
Laravelのビューコンポーザの使い方についてまとめました。
(Laravel) ビューコンポーザとは
laravelのビューコンポーザとは、
ビュー表示のためのビジネスロジックを記述するところだ。
ビジネスロジックとは簡単にいうと、
処理(ロジック)を書いてるところのことで、何らかの決まったロジックをビューに持たせるために使用される。
ビューコンポーザに書いてある処理はビューのレンダリングの際に自動実行される。

ビューコンポーザが生まれた経緯(主観あり)
ここで一つ、
ビューコンポーザが生まれた経緯というものを紹介したい(主観あり)。理由としては、ビューコンポーザの存在意義を理解することで、使い方や使い時をより正確に把握できるからだ。
ビュー表示のロジックをコントローラに書かないためにある
上述で、
ビューコンポーザは、ビュー表示のためのビジネスロジックを書くところと記述した。
本来、laravelなどのMVCモデルのフレームワークにおいて、ロジックはコントローラが担当する部分だ。ビューの役割は、クライアントへの表示内容を表示することであり、ロジックは書くべきでない。
しかし、何かview表示のためだけのロジックを書きたいという場合がある。
ビューのための処理をコントローラに書くのは、上述した理由から、そもそもMVCに反する行為になるのでNGという、大前提がある。
じゃあ結局どこに書いたらいいの?
→新しく書くところ作っちゃえ(ビューコンポーザ)!!
という経緯でビューコンポーザという、
ビュー表示のためのビジネスロジックを書くところなんてものができたのではないかと思っている。
ビューコンポーザの使い方
前置きが長くなったが、
ビューコンポーザの使い方を早速説明していく。
先に、ビューコンポーザの使い方のポイントを簡単にまとめると、以下のようになる。
- サービスプロバイダを作成する
- サービスプロバイダを登録する
- サービスプロバイダのbootメソッドに、View::composerメソッドを記述する。
ビューコンポーザを理解する鍵はサービスプロバイダ
ビューコンポーザを使うために理解する必要があるのが、
laravelのサービスプロバイダという機能だ。
サービスプロバイダはアプリ起動時に処理を割り込んで実行するものだ(ブートストラップ処理と呼ぶ)。
Laravelのサービスプロバイダ
https://readouble.com/laravel/8.x/ja/providers.html
サービスプロバイダは、Laravelアプリケーション全体の起動処理における、初めの心臓部です。皆さんのアプリケーションと同じく、Laravelのコアサービス全部もサービスプロバイダを利用し、初期起動処理を行っています。
なぜサービスプロバイダを理解する必要があるかというと、
サービスプロバイダに、ビューコンポーザを呼びだす処理(View::composerメソッド)を登録しておくことで、ビューが呼び出されたタイミングで、ビューコンポーザが自動的に実行されるようになるからだ。
自動的に呼び出される処理をView::composerメソッドに記載しておくことで、コントローラの領域を侵すことなく、またビューにロジックを書くこともなく、ビューのロジックを実行可能となる。

では次に、
実際にサービスプロバイダを通じてビューコンポーザを使用する方法を具体的に紹介していく。
①サービスプロバイダの作成
サービスプロバイダは以下のコマンドで作成できる。
〇〇はアプリ名が通例
# サービスプロバイダの作成コマンド
php artisan make:provider 〇〇ServiceProvider
作ったサービスプロバイダは下記に配置される
/app/Providers

②サービスプロバイダを登録する
次に、作成したサービスプロバイダをアプリに登録する。
作成したサービスプロバイダは作成しただけだと動いてはくれず、アプリに登録するという作業が作業が必要だ。
登録には、
設定ファイルである/config/app.phpに登録したいサービスプロバイダを記述してあげる必要がある。
設定ファイルである/config/app.phpを開く。
で、見ていくと「’providers’ =>….」という配列を定義しているところがある。
すでにいくつものサービスプロバイダーが登録されている。

この配列の最後の方に、「Application Service Providers」と書かれている群がある。
ここに、自分で作成したサービスプロバイダを登録するための一行を追記することで、
サービスプロバイダのアプリへの登録が、完了する。
書き方は下記
App\Providers\〇〇ServiceProvider::class

以上で①サービスプロバイダの作成の手順は完了。
③bootメソッドに、View::composerメソッドを登録
①で作成したサービスプロバイダにはデフォルトで、bootというメソッドが存在する。
このbootメソッドが、アプリ起動に処理を割り込んで実行するためのメソッドだ(ブートストラップ処理)。

そして、bootメソッド内に、「View::composerメソッド」を記述することで、
特定のビューを表示する際、自動的にビューコンポーザを呼び出すようにすることができる。
public function boot(){
View::composer( ビュー名, 関数またはクラス);
}
第一引数:処理を実行したいビュー名
第二引数:関数またはクラス。実行したいロジックを記述する。
第一引数には、「ロジックの結果を受け取って表示するビュー」を指定する。
指定の仕方は、viewメソッドでビューを指定する時と同様に、「’フォルダ名.ビュー名’」と言った具合に指定する。
第二引数には「無名関数(クロージャ)」または「クラス」を指定し、その処理内容に、ビューのロジックを書く。その戻り値が、第一引数で指定したビューへと引き渡されることで、ロジックありのビューを表示することができる。
クロージャの時の使い方と、クラスの時の使い方について順に説明していく。
View::composerメソッドの第二引数に、無名関数(クロージャ)を指定する場合
View::composerメソッドの第二引数に、無名関数(クロージャ)を指定する場合は、
単純に無名関数(クロージャ)に、実行したいロジックを記述すれば良い。
use Illuminate\Support\Facades\View; //追記する
public function boot(){
View::composer( ビュー名, function($view){ //引数に$viewを指定する
// ここにロジックを書く
});
}
クロージャの引数には、Illuminate\Support\Facades\View名前空間のViewクラスインスタンスである、$viewを指定すると良い。
上記クラスにはビューを管理するメソッドなどがまとめられおり、特にwithメソッドなんかはよく使う。
$view->with( 変数名, 値);
変数名に対応する値をビューに渡すことができ、ビューでは{{変数名}}という記述で値にアクセスできる。まあこの使い方はlaravelでは馴染みがあると思う。
# ビューコンポーザ
$view->with( 'message', 'HeyHeyHey!!');
# ビュー
<p> {{message}} </p> //HeyHeyHey!!
View::composerメソッドの第二引数に、クラスを指定する場合
第二引数にクラスを指定する場合、以下二つの手順を実行する必要がある。
- ビューコンポーザクラスを手書きで作成する
- ビューコンポーザを呼び出すための設定をする
①ビューコンポーザクラスを手書きで作成する
まずは呼び出すビューコンポーザクラスを手書きで作成する。
配置する場所は「/app/Http」以下であれば問題ない。
なので/app/Http/にViewComposerというディレクトリを切って作成するとする。
例えば、以下のようなHelloComposer.phpというビューコンポーザを作成。
# /app/Http/にViewComposer/HelloComposer.php
<?php
namespace App\Http\ViewComposer; //配置したディレクトリに沿って記述
use Illuminate\View\View; //追記する
class HelloComposer {
/**
* @param View $view
* @return void
*/
public function compose(View $view)
{
// ロジック
}
}
大事なのはcomposeメソッド。
composeメソッドは、サービスプロバイダのbootメソッド内に登録したView::composerメソッドの実行によって呼び出される。
composeメソッドの引数には、Illuminate\View\ViewクラスのView $viewインスタンスを指定する。
これは①クロージャで記述する時と同様の理由だ。
②ビューコンポーザを呼び出すための設定をする
作ったビューコンポーザを、View::composerメソッドの第二引数に指定する。
指定の仕方は下記参照(例)
View::composer( ビュー名, 'app\Http\ViewComposer\HelloComposer' );
第二引数には、ビューコンポーザのnamespace(app\Http\ViewComposer) + クラス名(HelloComposer)を指定する。
これでアプリ起動時、指定したクラス内のcomposeメソッドが自動的に呼び出され、記述されているビジネスロジックが自動実行される。
(Laravel) ビューコンポーザの使い方まとめ
- ビューのためのビジネスロジックは、ビューコンポーザに書く。
- ビューコンポーザは、ビューに渡す情報を処理するロジックを実行し、結果をビューに渡す。
- ビューは(なるべく)ビューコンポーザの結果を受けとって表示するだけにする。
関連記事
https://readouble.com/laravel/8.x/ja/views.html
ビューコンポーザ難しくて調べてたらここに来ました。
結局最初から読みましたがまとめ方がとても上手ですね。
配色とかも関心します。
ありがとうございました。
ありがとうございます!!
記事を褒められたの初めてですごく嬉しいです!