【Laravel】ビューコンポーザ1人勉強会【PHP】
個人的にLaravelのビューコンポーザについて以下のように理解しました。
- ビューコンポーザは、全てのページまたは複数のビューで使うような変数をまとめてビューコンポーザに書いておくものである。
- アクセスしたページがレンダリングされる際に自動的に実行される。
例えば10ページから構成されているWebページがあったとして、10ページ全てに組み込まれているコンテンツ(データ)があったして、コントローラからビューにそのコンテンツのデータを渡したいとき、10ページ分のコントローラのアクションにその処理を書かなくてはいけません。しかし、それでは同じ処理を書いて非常に効率が悪いので、ビューコンポーザを活用する。
実装方法として、2種類ある。
- boot関数内に無名クラスでビューコンポーザの処理の定義をする。
- ビューコンポーザのクラスを定義して、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' ); }