世界を旅して暮らしたい放浪エンジニアブログ

LaravelのViewComposerを利用してViewの共通データを管理

LaravelのViewComposerを利用してViewの共通データを管理します。複数のControllerからViewに値を渡す処理をなくし、処理の共通化とControllerのスリム化を目指します。

[ 目次 ]

はじめに

こんにちは、香港に住んでいるWEBデベロッパーのなかむ(@nakanakamu0828)です。

今回はViewComposerを利用して、Viewに共通データを渡すようにしたいと思います。
前回の「LaravelにてEnumを導入する」では、Enumで性別データを管理するようにしました。
この性別データの配列をViewでは、性別のプルダウンとして表示できるように実装していきます。

■ 環境

ライブラリ バージョン
PHP ^7.1.3
Laravel 5.6.*
laravel-enum ^1.10

ComposerServiceProviderを用意する

ComposerServiceProviderを作成

$ php artisan make:provider ComposerServiceProvider

app/Providersディレクトリ配下にComposerServiceProvider.phpが作成されます
中身の実装は後ほど追加していきます。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use View;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
      //
    }

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

config/app.phpのprovidersにComposerServiceProviderを追加

'providers' => [

        ・・・

        App\Providers\ComposerServiceProvider::class,

    ],

SexComposerを用意する

SexComposer.php作成

性別のEnumデータを配列として返却するComposerを用意します。
app/Http/ViewComposers/SexComposer.phpを以下の内容で作成します。

<?php

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use App\Enums\User\Profile\Sex;

class SexComposer {

    /**
     * @var String
     */
    protected $sexes;

    public function __construct()
    {
        $this->sexes = Sex::toArray();
    }

    /**
     * Bind data to the view.
     * @param View $view
     * @return void
     */
    public function compose(View $view)
    {
      // Viewからは $sexesでアクセスできるようになります
        $view->with('sexes', $this->sexes);
    }
}

ComposerSeriviceProvider.php修正

ComposerSeriviceProvider.phpのbootファンクション内にSexComposerの設定を追加していきます。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Http\ViewComposers\SexComposer;
use View;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        View::composers([
            SexComposer::class => [
                '*' // Viewsディレクトリの構造を元に設定。全ての画面で利用する場合、*(アスタリスクを利用する)
            ]
        ]);
    }

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

利用方法

それでは性別のプルダウンを用意してみます。

<select name="sex">
    @foreach($sexes as $k => $v)
        <option
            value="{{ $v }}"
            @if($profile->sex === $v) selected @endif
        >
            {{ __('enum.user_profile.sex.' . strtolower($k)) }}
        </option>
    @endforeach
</select>

プロフィール設定

最後に

Laravelは機能が豊富です。以下に「綺麗なコードを書くか?冗長なコードをなくすか?楽に実装できるか?」を考えながら自分の中でのベストプラクティスを見つけていきましょう。

参考記事

前のページ

次のページ

Profile

なかむ🇭🇰Webデベロッパー

なかむ🇭🇰Webデベロッパー

香港在住4年目になるWEBエンジニアのなかむです。 現在は、LaravelやRailsを利用したWEB開発を中心にエンジニアをしています。 顧客は全て日本の企業になります。リモート開発にて各企業様の支援を行なっております

プロフィール詳細はこちら

Latest Posts