たけるのプログラミング

作ったものとか、気ままにアップします。

【Laravel】ビューコンポーザ1人勉強会【PHP】

readouble.com

個人的にLaravelのビューコンポーザについて以下のように理解しました。

  • ビューコンポーザは、全てのページまたは複数のビューで使うような変数をまとめてビューコンポーザに書いておくものである。
  • アクセスしたページがレンダリングされる際に自動的に実行される。


例えば10ページから構成されているWebページがあったとして、10ページ全てに組み込まれているコンテンツ(データ)があったして、コントローラからビューにそのコンテンツのデータを渡したいとき、10ページ分のコントローラのアクションにその処理を書かなくてはいけません。しかし、それでは同じ処理を書いて非常に効率が悪いので、ビューコンポーザを活用する。


実装方法として、2種類ある。


  1. boot関数内に無名クラスでビューコンポーザの処理の定義をする。
  2. ビューコンポーザのクラスを定義して、boot関数内で設定する。

1 boot関数内に無名クラスでビューコンポーザの処理の定義をする。

まずルーティングを以下のように定義
Web.php

Route::get('composertest','ComposerTestController@index');


コントローラをartisanコマンド(php artisan make:controller ComposerTestController)で作成する。
ComposerTestController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ComposerTestController extends Controller
{
    //
    public function index()
    {
        return view('test.index');
    }
}


ビューはこんな感じで値を表示するだけ
test/index.blade.php

<p>表示テスト</p>
<p>{{$test_message}}</p>


サービスプロバイダにビューコンポーザを登録する。artisanコマンド(php artisan make:provider ComposerTestProvider)でサービスプロバイダを作成する。
その後、configフォルダのapp.phpのproviders配列に作成したプロバイダークラスを記述しておく。

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ComposerTestProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
        View::composer('test.index', function ($view) {
            $view->with('test_message','鬼滅の刃2期スタート by ビューコンポーザ');
        });

    }
}

また全てのビューに対してビューコンポーザを適応したい場合は以下のようにする。

View::composer('*', function ($view) {
    //
});

こうすることで、ビューがレンダリングされる際にコンポーザが呼び出され、viewにおけるtest_messageに値が代入される。

2 ビューコンポーザのクラスを定義して、boot関数内で設定する。

以下のようなビューコンポーザクラスを定義
testComposer.php

<?php
namespace App\Http\Composers;

use Illuminate\View\View;

class testComposer
{
    public function compose(View $view)
    {
        $view->with('test_message','煉獄さん');
    }
}

1のプロバイダーのboot関数を以下のように変更し、コンポーザークラスを利用できるようにする。

 public function boot()
    {
        //
        View::composer('test.index',
        'App\Http\Composers\testComposer'
        );

    }

readouble.com