参考図書
ビューコンポーザとは
LaravelはMVCアーキテクチャ。
ビューで処理をした内容を表示したい場合、ビューのテンプレートBladeで@php
ディレクティブを使うやり方や、コントローラーで処理をして値を渡す方法はある。しかし、表示するだけの役割のビューテンプレートで処理をするのは避けたほうがよく、コントローラーで処理をするのも何か違う気がする。という問題がMVCにはあった。
その問題を解決するのがビューコンポーザ。
指定のビューに常に同じ処理をして表示するものがある場合、ビューコンポーザを利用したほうが良い。
サービスとサービスプロバイダ
ビューコンポーザはLaraveの「サービス」、「サービスプロバイダ」を使う。
サービスはLaravelの機能強化の仕組み。
サービスを登録するために用意するのが「サービスプロバイダ」。
サービスプロバイダにビューコンポーザというサービスを登録しておくと、自動的に実行されるようになる。
サービスプロバイダのつくりかた
php artisan make:provider HelloServiceProvider
app/provider/の中にファイルが作成される
サービスプロバイダの基本形
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class プロバイダクラス extends ServiceProvider{
public function register(){
//コンポーザの設定
}
public function boot(){
//コンポーザの設定
}
}
サービスプロバイダはServiceProviderというクラスを継承して作成される。
registerメソッドはサービスプロバイダの登録処理を行う。
bootメソッドはアプリケーションサービスへのブートストラップ処理(アプリケーションが起動する際に割り込んで実行される処理)。
ここにコンポーザを設定する処理を用意することで、設定したビューをレンダリングする際に自動的にコンポーザが呼び出されるようになる。
サービスプロバイダの登録
HelloServiceProviderクラスをプロバイダとしてアプリケーションに登録
'providers' => [
...
...
App\Providers\HelloServiceProvider::Class
],
ビューコンポーザの使い方
ビューコンポーザには二通りの使い方がある
- boot内に無名クラスでビューコンポーザの処理を読み込む
- ビューコンポーザのクラスを定義して、bootで設定する
本格的に使うときは「ビューコンポーザのクラスを定義して、bootで設定する」。
boot内に無名クラスでビューコンポーザの処理を読み込む
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class プロバイダクラス extends ServiceProvider{
public function register(){
//コンポーザの設定
}
public function boot(){
View::composer(
'hello.index', function($view){
$view->with('view_message','composer message!');
}
);
}
}
引数の$viewはIlluminate\View名前空間にあるViewクラスのインスタンス。ここにあるメソッドなどを利用してビューを操作することができる。
withメソッドはビューに変数などを追加することができる。
$view->with('変数名','値');
ビューコンポーザを利用
@section('content')
<p>ViewComposer value:{{$view_message}}</p>
@endsection
ビューコンポーザのクラスを定義して、bootで設定する
ビューコンポーザのクラスは特に配置する場所は用意されていない。Httpフォルダ内であればどこでも利用可能。
namespace App\Http\Composers;
use Illuminate\View\View;
class HelloComposer{
public function compose(View $view){
$view->with('view_message' $view->getname());
}
}
コンポーザクラスで必要になるのはcomposeメソッド。インスタンスを引数として持っていて、サービスプロバイダのbootからView::composerが実行された際に呼び出される。
上記のHelloComposerをビューコンポーザとして利用するため、HelloServiceProviderに記述。
public funtion boot(){
View::composer(
'hello.index', 'App\Http\Composers\HelloComposer'
);
}
第2引数に呼び出すクラス名を指定。