Help us understand the problem. What is going on with this article?

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

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした