4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

LaravelAdvent Calendar 2019

Day 15

LaravelのViewComposerで継承を使わずに共通化する

Last updated at Posted at 2019-12-14

この記事はLaravel Advent Calendar 2019の15日目の記事です。

ViewComposerとは?

ビューコンポーザはビューがレンダーされる時に呼び出される、コールバックかクラスメソッドのことです。ビューがレンダーされるたびに結合したい情報があるなら、ビューコンポーザがロジックを一箇所にまとめるのに役立ちます。
ビュー 6.x Laravel

基本的な実装方法も上記Laravelのドキュメントで確認することができます。

ViewComposerの実装を共通化する

本記事ではサンタクロース(santa-claus)画面とトナカイ(reindeer)画面にそれぞれViewComposerを定義し、
それぞれ共通して isChristmas をViewから参照させます。
これを継承を使った方法を紹介した上で、継承を使わずに共通化する方法を紹介します。

継承を使った実装

isChristmas を設定する ChristmasViewComposer を実装し、 SantaClausViewComposerReindeerViewComposer がそのクラスを継承します。

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 を実装しますが、 SantaClausViewComposerReindeerViewComposer はそれを継承しません。

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の実装を共通化できます。

クラス継承にはデメリットが多いため、クラス継承を使わない共通化の方法を紹介しました。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?