この記事はLaravel Advent Calendar 2019の15日目の記事です。
ViewComposerとは?
ビューコンポーザはビューがレンダーされる時に呼び出される、コールバックかクラスメソッドのことです。ビューがレンダーされるたびに結合したい情報があるなら、ビューコンポーザがロジックを一箇所にまとめるのに役立ちます。
ビュー 6.x Laravel
基本的な実装方法も上記Laravelのドキュメントで確認することができます。
ViewComposerの実装を共通化する
本記事ではサンタクロース(santa-claus)画面とトナカイ(reindeer)画面にそれぞれViewComposerを定義し、
それぞれ共通して isChristmas
をViewから参照させます。
これを継承を使った方法を紹介した上で、継承を使わずに共通化する方法を紹介します。
継承を使った実装
isChristmas
を設定する ChristmasViewComposer
を実装し、 SantaClausViewComposer
と ReindeerViewComposer
がそのクラスを継承します。
namespace App\Http\View\Composers;
use Illuminate\View\View;
class ChristmasViewComposer
{
public function compose(View $view)
{
$view->with('isChristmas', $this->isChristmas());
}
private function isChristmas()
{
return false; // FIXME 適当な実装
}
}
class SantaClausViewComposer extends ChristmasViewComposer
{
public function compose(View $view)
{
parent::compose($view);
// FIXME サンタクロース(santa-claus)画面に必要な実装
}
}
class ReindeerViewComposer extends ChristmasViewComposer
{
public function compose(View $view)
{
parent::compose($view);
// FIXME トナカイ(reindeer)画面に必要な実装
}
}
コンポーザーの定義はこのようになります。
View::composer('santa-claus', 'App\Http\View\Composers\SantaClausViewComposer');
View::composer('reindeer', 'App\Http\View\Composers\ReindeerViewComposer');
継承を使わない実装
isChristmas
を設定する ChristmasViewComposer
を実装しますが、 SantaClausViewComposer
と ReindeerViewComposer
はそれを継承しません。
namespace App\Http\View\Composers;
use Illuminate\View\View;
class ChristmasViewComposer
{
public function compose(View $view)
{
$view->with('isChristmas', $this->isChristmas());
}
private function isChristmas()
{
return false; // FIXME 適当な実装
}
}
class SantaClausViewComposer
{
public function compose(View $view)
{
// FIXME サンタクロース(santa-claus)画面に必要な実装
}
}
class ReindeerViewComposer
{
public function compose(View $view)
{
// FIXME トナカイ(reindeer)画面に必要な実装
}
}
継承していないためコンポーザーをこのように定義します。
View::composer(
['santa-claus', 'reindeer'],
'App\Http\View\Composers\ChristmasViewComposer'
);
View::composer('santa-claus', 'App\Http\View\Composers\SantaClausViewComposer');
View::composer('reindeer', 'App\Http\View\Composers\ReindeerViewComposer');
まとめ
ドキュメントには書かれていませんが、一つのViewに対して複数の複数のViewComposerを登録することも可能なため、継承を使わなくてもViewComposerの実装を共通化できます。
クラス継承にはデメリットが多いため、クラス継承を使わない共通化の方法を紹介しました。