ホーム > カテゴリ > PHP・Laravel・CakePHP >

ビューコンポーザの使い方 [Laravel]

Laravelの「ビューコンポーザ」はコントローラーの処理後にビューがレンダリングされる前に実行されるサービスプロバイダ(処理)です。

コントローラー、ビューのどちらにも記述したくないビジネスロジックをビューコンポーザで記述します。

「クロージャ」と「Composerクラス」を使用した例の2つをご紹介します。

1. サービスプロバイダの作成と設定

ファイルの作成

次のコマンドを実行すると

php artisan make:provider HelloServiceProvider

app\Providers\HelloServiceProvider.phpが生成されます。

サービスプロバイダの設定

config\app.phpのprovidersの末尾に次のコードを追記します。

'providers' => [
    
    // 追加
    App\Providers\HelloServiceProvider::Class,
],

2. クロージャを使用した例

コントローラー

public function index(Request $request)
{
    return view('index', 'hoge'=> 'プチモンテ']);
}    

app\Providers\HelloServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

// 追加分
use Illuminate\Support\Facades\View;

class HelloServiceProvider extends ServiceProvider
{
    public function register()
    {
        //
    }

    public function boot()
    {
       View::composer(
           'index', function($view){
               $view->with('message', $view->hoge . ' https://www.petitmonte.com/');
           }
       );       
    }
}

ビュー

{{ $message }}

この結果は次のようになります。

プチモンテ https://www.petitmonte.com/

ビューコンポーザはコントローラーとビューの中間で処理が行われます。

3. Composerクラスを使用した例

先ほどはクロージャの例でしたが、今後はComposerクラスを使用します。

app\Http\View\Composers\HelloComposer.php

このファイルを手動で作成します。

<?php

namespace App\Http\View\Composers;

use Illuminate\View\View;

class HelloComposer
{
    public function compose(View $view)
    {
        $view->with('message', $view->hoge . ' https://www.petitmonte.com/');
    }
}

app\Providers\HelloServiceProvider.php

HelloServiceProvider.phpを次のように修正します。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

// 追加分
use Illuminate\Support\Facades\View;

class HelloServiceProvider extends ServiceProvider
{
    public function register()
    {
        //
    }

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

実行すれば結果は同じになります。

最後に

ビューコンポーザの利用は現場の判断によると思いますが、サービスプロバイダの登録の手間や、ソースコードが分断されるので私は積極的には使わないと思います。

ただ、共通処理を行う場合には良いかも知れません。

View::composer(
    ['profile', 'dashboard'],
    'App\Http\View\Composers\MyViewComposer'
);

こんな感じで複数のビューを適用可能です。

参考文献

Laravel 6.x ビュー (公式)





関連記事



公開日:2020年11月17日
記事NO:02854