Laravelの「ビューコンポーザー」機能について調べたのでまとめてみます。
ビューコンポーザーとは
ビューコンポーザーとは、おおまかに以下のようなものです。
- ビューをレンダリングするたびにビューに渡すデータがある場合、そのデータを作成して渡す仕組み。
- ビューに渡すデータはコントローラ内で作成して渡すこともできるが、ビューに特化したデータはコントローラから切り離してビューコンポーザーに集約することができる。
- ビューコンポーザのロジックは専用のクラス または クロージャーとして作成し、それをサービスプロバイダの boot()メソッド内から呼び出すことでレンダリング時に自動で呼び出されるようにする。
ビューコンポーザーの作成手順
‘ganbo.blade.php’ に適用するビューコンポーザ「MyComposer」を例に、以下に作成手順を示します。
クラスで実装する場合
- ビューコンポーザークラス用のスクリプトファイルを作成する
app/View/Composers/MyComposer.php ファイルを作成し、その中に以下の記述をします。
ビューコンポーザーのファイルを作成するartisanコマンドは無いので手動で作ります。
ここでポイントとなるのは、「compose(View $view)」メソッドを実装することと、その中でビューに対する処理を記述することです。
下記の例では withメソッドを使い、ビューの ‘myname’変数に ‘Ganbo’ という値をバインドしています。
<?php
namespace App\View\Composers;
use Illuminate\View\View;
class MyComposer
{
/**
* Bind data to the view.
*
* @param \Illuminate\View\View $view
* @return void
*/
public function compose(View $view)
{
$view->with('myname', 'Ganbo');
}
}
- サービスプロバイダを作成する(既存のサービスプロバイダを使う場合は不要)
laravelプロジェクトのルートディレクトリで以下のコマンドを実行し、app/providers/MyComposerProvider.phpを作成します。
$ php artisan make:provider MyComposerProvider
- ビューコンポーザをサービスプロバイダに登録する
MyComposerProvider.php (既存のサービスプロバイダを使う時はそれ)に、以下を記述します。
ここでは boot() メソッドの中で、先ほど作成したビューコンポーザのクラスを ‘ganbo’ビューのレンダリング時に自動で呼び出されるように設定しています。
<?php
namespace App\Providers;
use App\View\Composers\MyComposer; // 先ほど作成したビューコンポーザをインポートする
use Illuminate\Support\Facades\View; // Viewもインポートする
use Illuminate\Support\ServiceProvider;
class MyComposerProvider extends ServiceProvider
{
public function boot()
{
// 第1引数にビューを、第2引数に適用するビューコンポーザーを指定する
View::composer('ganbo', MyComposer::class);
}
}
- bladeテンプレートで設定された値を使う
bladeテンプレート内では以下の記述で変数の値を取り出せます。
{{$myname}}
クロージャーで実装する場合
- サービスプロバイダを作成する
クラスで実装する場合と同じ手順で作成します。既存のサービスプロバイダを使う場合は不要です。
- サービスプロバイダのboot()メソッド内にビューコンポーザのクロージャーを書く
MyComposerProvider.php (既存のサービスプロバイダを使う時はそれ)に、以下を記述します。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
public function boot()
{
View::composer('ganbo', function ($view) {
$view->with('myname', 'Ganbo');
});
}
}
- bladeテンプレートで設定された値を使う
クラスで実装する場合と同じ手順で利用します。