LoginSignup
46
44

More than 3 years have passed since last update.

Laravel view composerでロジックを一箇所にまとめよう!

Last updated at Posted at 2019-12-05

この記事について

あらすじ

自社サービス開発の中で共通でuser情報を使い回している箇所があり、その部分が煩雑な書き方になっていたので、処理をどこか一つにまとめたいと思っていました。

やりたい事

  • 共通でuser情報を使い回しているを共通化する。
  • ヘッダーのbladeファイル以外でサイドバーなどの箇所でもuser情報を使いたい。

やってみた事

  • Laravel view composerを使って、処理を共通化する。

view composerとは?

ビューコンポーザはビューがレンダーされる時に呼び出される、コールバックかクラスメソッドのことです。

ビューがレンダーされるたびに結合したい情報があるなら、ビューコンポーザがロジックを一箇所にまとめるのに役立ちます。

処理イメージ図

スクリーンショット 2019-12-05 17.40.11.png

どんな時に使うのか?

  • サイドバーなどすべてのページで共通するデータを表示したい時。

  • ビューロジックはできればコントローラーに書きたくないし、テンプレートもできるだけロジックを入れず、綺麗なhtmlのままでありたい。

  • コントローラーの肥大化を防ぎたい。

実装方法

実装手順

  • ①サービスプロバイダーの用意
  • ②app/config.phpに登録
  • ③Composerクラスの作成
  • ④SeriviceProviderへの設定
  • ⑤bladeファイルの修正

①サービスプロバイダーの用意

$ php artisan make:provider ViewComposerServiceProvider を実行して、サービスプロバイダーを生成する。


<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use View;

/**
 * Class ViewComposerServiceProvider
 * @package App\Providers
 */
class ViewComposerServiceProvider extends ServiceProvider
{
    /**
     *
     */
    public function boot()
    {
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

②app/config.phpに登録

「config/app.php」へ下記のようにSeriviceProviderを登録する

<?php

'providers' => [
        App\Providers\ViewComposerServiceProvider::class,
    ],

③Composerクラスの作成

「app/Http/ViewComposers」という形でディレクトリを作成し、ViewComposersディレクトリの中に「LayoutComposer.php」を作成します。

<?php

namespace App\Http\ViewComposers\User\Worker;

use Auth;
use Illuminate\View\View;

/**
 * Class LayoutComposer
 * @package App\Http\ViewComposers\User\Worker
 */
class LayoutComposer
{
    /**
     * @param View $view
     */
    public function compose(View $view)
    {
        $view->with([
            'loginUser' => Auth::user(),
        ]);
    }

}

④SeriviceProviderへの設定

bootメソッドにViewComposerが値を渡すviewを、View::composersメソッドを使って指定します。

<?php

namespace App\Providers;

use App\Http\ViewComposers\User\Agent as Agent;
use App\Http\ViewComposers\User\FriendRecommendComposer;
use App\Http\ViewComposers\User\Worker as Worker;
use Illuminate\Support\ServiceProvider;
use View;

/**
 * Class ViewComposerServiceProvider
 * @package App\Providers
 */
class ViewComposerServiceProvider extends ServiceProvider
{
    /**
     *
     */
    public function boot()
    {
        View::composers([
            Agent\LayoutComposer::class => 'agent.*',
            Worker\LayoutComposer::class => 'worker.*',
            FriendRecommendComposer::class => 'user.friend_recommend.block',
        ]);
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

⑤bladeファイルの修正

$loginUserの変数を該当箇所に書く

<?php
                <div class="user-block">
                    <div class="img-wrap">
                        <img src="{{ $loginUser->userProfile->image->url }}" alt="">
                    </div>
                    <div class="user-name">{{ $loginUser->userProfile->display_name }}</div>
                    <div class="user-type">{{ \App\Enums\UserRole::toJapanese($loginUser->userProfile->role) }}</div>
                </div>

スクリーンショット 2019-12-05 18.01.45.png

まとめ

  • 共通で使うような変数やロジックがあればview composerにまとめよう!

参考記事

46
44
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
46
44