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 }}
ビューコンポーザで用意した「’渡したいデータ’」が表示されるはずです。
コメントする