この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:9
ページ更新者:T
更新日時:2019-04-01 10:52:33

タイトル: ViewComposerを用いてviewに共通の値を付与する方法
SEOタイトル: 【Laravel】ViewComposerを用いてviewに共通の値を付与する方法

Layoutで必ず取得しなければならない値をわざわざ一つずつのコントローラーで取得するのは冗長的である。

当問題はViewComposerという機能を用いて解決することができる。

 

プロバイダーの作成

php artisan make:provider ComposerSeriviceProvider

 

プロバイダーの登録

config/app.phpに以下の記述を追加する。

'providers' => [

    ...

    App\Providers\ComposerSeriviceProvider::class,

]

 

サービスプロバイダー

<?php

namespace App\Providers;

use App\Http\ViewComposers\CommonComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ComposerSeriviceProvider extends ServiceProvider
{
    /**
     * コンテナ結合の登録
     *
     * @return void
     */
    public function
boot()
    {

        // クラスベースのコンポーザを使用する
         View::composers([
            CommonComposer::class => [
                'layout.*',
                'admin.*'
            ]
        ]);

        View::composer(
            'profile', 'App\Http\ViewComposers\CommonComposer'
        );

        // クロージャベースのコンポーザを使用する
        View::composer('dashboard', function ($view) {
            //
        });

    }
}

 

コンポーザー(クラスベースの場合)

<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;
use App\Repositories\UserRepository;

class CommonComposer
{
    /**
     * userリポジトリの実装
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * 新しいプロフィールコンポーザの生成
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        // 依存はサービスコンテナにより自動的に解決される
        $this->users = $users;
    }

    /**
     * データをビューと結合
     *
     * @param  View  $view
     * @return void
     */
    public function
compose(View $view)
    {

        $view->with('aaa', 'bbb')
           
->with('ccc', 'ddd');
    }
}

 

composeの実行タイミング

View::composer(...)はViewのレンダリング後に実行される。

View::creator(...)を使用するとレンダリング前に実行される。

例えばAuth::check()の値はcreatorを使用しなければ正しい真偽値が取得できないといった事例がある。