Laravel viewに共通変数を使いたいが中身を画面に応じて変えたい


Qiita投稿 #30

今回は・・・
Laravelのビューコンポーザを使用した時の備忘録です。

SampleProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;

class SampleServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     * 
     */
    public function register()
    {

    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {

        View::composer(['Sample1','Sample2','Sample3'],'App\Http\ViewComposers\SampleComposer');

    }
}

php artisan make:provider SampleServiceProvider
上記でプロバイダを作成しbootメソッド内にviewを指定します。
Sample1,2,3には同じ変数を使用するが中身は変えたいという場合を想定し、SampleComposerで条件分岐させます。

SampleComposer.php
<?php 
namespace App\Http\ViewComposers;

use Illuminate\View\View;

class NamingComposer
{
    // 省略

    public function compose(View $view)
    {

        // 画面に応じて分岐
        switch($view->name()){
            case 'Sample1':
                $view->with('success','サンプル1です');
                break;
            case 'Sample2':
                $view->with('success','サンプル2です');
                break;
            case 'Sample3':
                $view->with('success','サンプル3です');
                break;
            default:
                break;
        }
    }
}

laravelで用意されているViewクラスのメソッドを使う場合view()もしくはview->with()で画面や変数指定をする機会が多いと思います。
日本語記事でこれ以外のメソッドが紹介されているのはあまり見かけませんが、laravel APIドキュメントを見ると様々なメソッドが用意されています。

view->name()

view->name()は現在のviewの名前を取得します。
今回はこちらのメソッドを使用しSampleComposer内で画面名に応じて処理を書いていきます。
またサービスコンテナに共通ロジックを書いておくことで、「依存度が下がる」「複数のファイルに同じコードを書かなくて済む」「修正する際は1つのファイルのみで済む」「可読性が上がる」など様々なメリットがあります。composerでも独自のサービスコンテナを使用することができますので、積極的にサービスコンテナとビューコンポーザを使っていきたいですね。一人でアプリケーションを作成する時は気にする必要はあまりないですが、チームで開発するときは「共通項はまとめる」という意識が重要かと思います。

参考