WEB/システム/IT技術ブログ

Laravelでサービスプロバイダとビューコンポーザを利用して全てのビューに共通の値を渡す

Laravel初心者の私ですが、テンプレートの共通部分に毎回同じ処理済みの値を渡したいケースがあり、その場合に全てのコントローラに同じ処理を書くのはイケてないなぁと考えてました。
例えば、設定ファイルやDBの値を取得、加工して、ヘッダのグロナビにデータを渡したい場合など、全画面で必要とする処理を共通化したかったのです。
調べてみたら、サービスプロバイダとビューコンポーザというしくを使えば目的を達成できそうなので、早速試してみました。

サービスプロバイダを作成する

まずはサービスプロバイダを作成します。サービスプロバイダは、任意のビューに対してコントローラとは別に一定の値を渡すことができます。
作成にはartisanコマンドで作成することができます。例えば共通ヘッダにセットする値を処理するHeaderServiceProviderを作成する場合、以下のコマンドで作成できます。

> php artisan make:provider HeaderServiceProvider

そうすると「/app/Providers/HeaderServiceProvider.php」ファイルが生成されます。中味は以下のとおりです。

namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class HeaderServiceProvider extends ServiceProvider
{
  public function register()
  {
  }

  public function boot()
  {
  }
}

サービスプロバイダを編集する

先ほど作成したHeaderServiceProvider.phpを編集します。

namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class HeaderServiceProvider extends ServiceProvider
{
  public function register()
  {
  }

  public function boot()
  {
    View::composer(
      '*',
      'App\Http\Composers\HeaderComposer'
    );
  }

まず、Viewクラスを利用するため「use Illuminate\Support\Facades\View;」を追加します。

次に関数bootを編集します。関数registerは基本的に編集しません。
ビューコンポーザを利用するため関数composerを登録するのですが、第1引数には値を渡す対象のビューを指定します。「hello.index」のように特定のビューに値を渡しますし、「*」(アスタリスク)を設定することで全てのビューに値を渡します。「hello.*」といった指定も可能です。
第2引数には渡す値を指定するのですが、ビューコンポーザとなるクラスを指定することで、そのクラスで処理した値を渡すことができます。ビューコンポーザHeaderComposerは後ほど作成します。

サービスプロバイダを登録する

サービスプロバイダはこのままでは機能しません。機能させるためには設定ファイルに登録します。
ファイル「config/app.php」を開き、providersの中に記述されてるプロバイダ群に、先ほど作成したプロバイダHeaderServiceProviderを追記します。

  'providers' => [
    (中略)
    App\Providers\HeaderServiceProvider::class,
  ]

ビューコンポーザを作成する

次に、サービスプロバイダで渡す値を用意するビューコンポーザを作成します。
ビューコンポーザの作成コマンドもなければ、クラスの設置場所も特に決まってませんが、今回は先ほど指定したパスに用意します。
フォルダ「app/Http/Composers/」にファイル「HeaderComposer.php」を作成して、以下の内容を記述します。

namespace App\Http\Composers;
use Illuminate\View\View;
class HeaderComposer
{
  public function compose(View $view)
  {
    /* 設定ファイルやDBの値を取得して、渡したいデータを生成する処理 */
    $view_header = '渡したいデータ';
    $view->with('view_header', $view_header);
  }
}

関数withの第1引数はビューで利用する変数名、第2引数はその値を設定します。

サービスプロバイダとビューコンポーザで用意したデータを実際にビューで利用する

これで準備は整いました。
それでは実際、任意のビューで準備したデータを利用してみます。

{{ $view_header }}

ビューコンポーザで用意した「’渡したいデータ’」が表示されるはずです。

B!

Comment

コメントはありません

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Monthly Archives