【laravel】ビューコンポーサー

# 概要
ビューコンポーサーとはビューを生成する際に自動的に実行される処理を用意するための部品で、サービスプロバイダのbootメソッドに記述します。
サービスプロバイダについては[サービスプロバイダ](https://qiita.com/gone0021/items/46a218c65753fbda3c19)をご参考ください。

# ビューコンポーサーの作成
ビューコンポーサーの作成には2通りの方法があります。
・サービスプロバイダのbootメソッドにクロージャーで記述する
・クラスで定義してメソッドでロードする

クラスを定義するかどうかの違いのため、どちらで作成しても同じ処理を実行します。
そのため、処理内容の解説とビューによる読み込みは最後にまとめて記述します。

## クロージャーで記述
先に処理のわかりやすいbootメソッドにクロージャーで記述する方法を例にします。
クロージャーとは、ざっくり言えばブロックで囲んだ中にある処理を実行する自己完結型の機能です。
ここで言うfunction (＄view) {＄view->with(...);}です。


```php:ServiceProvider 
namespace App\Providers;
// ここから
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
// ここまで

class SampleServiceProvider extends ServiceProvider {
  public function boot() {
    // ここから
    view::composer (
      'sample.index',
      function ($view) {
        $view->with('view_msg', 'composer massage!');
      }
    );
    // ここまで
  }
}
```

## クラスによる定義
クラスを定義してサービスプロバイダでロードするため、2つのファイルが必要になります。


### クラスの作成
SampleComposerクラスを作成します。
ビューコンポーサーのクラスにディレクトリの指定はないためapp\Http内に作成します。
今回はHttp直下にComposersファイルを作成して使用します。

```:ディレクトリ
app
├─ Http
|  ├─ Composers
|  |  ├─ SampleComposer.php
```

```php:SampleComposer
namespace App\Http\Composers;

use Illuminate\View\View;

class SampleComposer {
  public function compose(View $view) {
    $view->with('view_msg','composer massage!');
  }
}
```

### サービスプロバイダの編集
「メソッド内に記述する」の中身と重複しているnamespaceとuseについては省略します。

```php:SampleServiceProvider 
class SampleServiceProvider extends ServiceProvider {
  public function boot() {
    view::composer(
      'hello.index', 'App\Http\Composers\SampleComposer '
    );
  }
}
```


# ビューによる読み込み
サービスプロバイダで定義した変数の値を取得します。

```php:index
  <p> {{$view_msg}} </p>
```

```:出力イメージ
composer massage!
```

# 処理の解説
今回使用したメソッドについて解説します。

## view::composer
ビューコンポーサーを使用するためにcomposerメソッドを実行します。
composerメソッドでは指定したビューに値を紐付けることができます。
メソッド内で記述する場合とクラスを定義する場合で記述内容は異なりますが、どちらもsample.indexにビューコンポーサーを割り当てて、$view->withを実行するという内容です。

```php:
// メソッド
view::composer ('sample.index', function ($view) {
  //
});

// クラス
view::composer ('sample.index', 'App\Http\Composers\SampleComposer');
// 記述方法：composer ('フォルダ名．ファイル名', 'メソッドまたはクラス')
```

## $view->with
＄view()はIlluminate\Support\Facades\ViewにあるViewクラスのインスタンスです。
withは変数に値を返すメソッドです。

```php:
function ($view) {
  $view->with('view_msg', 'composer massage!');
}
// 記述方法：with('変数名', '値')
```

# 複数のビューに適用
ビューコンポーサーは複数のビューに適用することができます。
これには複数の書き方があるため分けて解説します。

## 全てに適用
全てのビューコンポーサーに適用する記述方法です。
*をワイルドカードとして使用します。

```php:
view::composer ('*', 'App\Http\Composers\SampleComposer');
// 記述方法：view::composer ('*', 'メソッドまたはクラス')
```

## 配列で指定
composerの第一引数を配列で指定する記述方法です。

```php:
view::composer (['sample.index', 'sample.profile', 'test.index',]
                , 'App\Http\Composers\SampleComposer');
// 記述方法：view::composer (['フォルダ名．ファイル名', ...], 'メソッドまたはクラス')
```

## 複合型
特定のビュー全体と一部のビューに適用する方法です。
composerの第一引数を配列で指定し、全体に適用させたいビューのファイル名を*とし記述ます。
ここではsampleディレクトリの全てとtestディレクトリのindexのみに適用と記述したものを例としています。

```php:
view::composer (['sample.*', 'test.index',]
                , 'App\Http\Composers\SampleComposer');
// 記述方法：view::composer (['フォルダ名．＊', 'フォルダ名．ファイル名'...], 'メソッドまたはクラス')
```

# 参考
[Laravel 6.x ビューコンポーザ](https://readouble.com/laravel/6.x/ja/views.html#view-composers)
[Laravel 6.x サービスプロバイダ](https://readouble.com/laravel/6.x/ja/providers.html)