コントローラとは別なロジックを使って処理を行い、ビューにデータを結合させたいときに、
「ビューコンポーザ」と「サービスプロバイダ」を使用します。
今回は、それぞれの役割や関係性、使い方について解説していきます(^_^)
参考書
ビューコンポーザ
ビューコンポーザは、ビューをレンダリングする際に自動的に実行される処理を用意しておくための部品であり、関数やクラスとしてつくることができます。
View クラスが引数として渡され、それを利用することでテンプレートにデータを渡すことができます。
ただし、ビューコンポーザはあくまで処理内容を規定する部品であり、
「ビューをレンダリングする際に自動的に実行される」という機能までは持っていません。
そこで、サービスプロバイダを利用する必要があります。
サービスプロバイダ
ビューコンポーザのようなサービスを利用するために使われるのがサービスプロバイダです。
サービスプロバイダは、アプリケーション内で様々な機能を実行するのに利用されており、非常に重要な役割をはたしています。
サービスプロバイダを用意しておくことで、必要に応じて特定のサービスを組み込んで使えるようにすることができます。
サービスプロバイダ・ビューコンポーザの作成
サービスプロバイダの作成
では、コマンドラインで以下のように実行します。
php artisan make:provider SampleServiceProvider
これで、「app/providers」の中に「SampleServiceProvider.php」というファイルが作成されます。
中身を見ると、以下のようになっています。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class SampleServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
//
}
}
register メソッドには、サービスを登録する処理などを記述します。
今回は使わないので削除しても大丈夫です。
boot メソッドには、ブートストラップ処理(アプリケーションが起動する際に割り込んで実行する処理)を記述します。
ここにビューコンポーザを設定する処理を用意します。
その前に、View クラスを使用するため、以下の use 文を追加しておいてください。
use Illuminate\Support\Facades\View;
では、boot メソッドに以下の記述をしましょう。
public function boot()
{
View::composer(
'sample.index', 'ビューコンポーザ―クラス'
);
}
View::composer というメソッドが、ビューコンポーザを設定するためのものです。
これで、指定のビューがレンダリングされる際に関数やクラスが実行されるようになります。
ビューの部分には、「views/sample/index.blade.php」ファイルを指定しています。
「ビューコンポーザ―クラス」の部分に関しては、これからビューコンポーザ―を作成しそのクラスを指定するので、後で修正すると認識しておいてください。
サービスプロバイダの登録
実はこの状態ではサービスプロバイダは動かず、サービスプロバイダ自体をアプリケーションに登録する必要があります。
「config/app.php」を開き、
‘providers’ というキーの配列を見つけてください。
その中の一番下に、以下を追加し登録します。
App\Providers\SampleServiceProvider::class
ビューコンポーザの作成
ビューコンポーザのクラスの配置場所は特に用意されておらず、「Http」フォルダ内であればどこに置いても利用できます。
今回は「Http」フォルダ内に「Composers」というフォルダを作り、その中に「SampleComposer.php」というファイルを作り、以下のように記述します。
<?php
namespace App\Http\Composers;
use Illuminate\View\View;
class SampleComposer
{
public function compose(View $view){
$view->with('viewName', $view->getName());
}
}
compose メソッドは、サービスプロバイダの boot から View::composer が実行されたときに呼び出されます。
そして、View クラスのインスタントとして $view を用意することで、ビューを操作することができます。
with メソッドは以下のように使用し、
値を入れた変数をビューに渡すことができます。
今回は、「$view->getName()」でビューの名前を取得して「viewName」という変数名でビューに渡しています。
では最後に、「views/sample/index.blade.php」の @section(‘content’) を以下のように記述します。
@section('content')
<p>ここはcontentセクションです</p>
<p>ビューの名前:{{$viewName}}</p>
@endsection
ブラウザの表示↓

無事に表示が完了しました。
今回は以上になります。
ご覧いただきありがとうございました(^^)
参考書
続きはこちら↓
コメント