Laravelの機能であるビューコンポーザについて、何だろう?と思ったので、調べたことを整理します。
ビューコンポーザとは?
コントローラーと切り分けてロジックを記述でき、ビューにデータを結合することができます。
LaravelではBladeでPHPを記述することができ、ロジックを記載することもできるが、MVCの概念的には好ましくないです。
とはいえ、コントローラーに記述すると記述量が増えて、いわゆるFat controllerになってしまいます。この問題を解決するための機能になります。
リクエスト→ルーティング→コントローラー→レンダリング→ビュー
の流れでいうと、レンダリングの処理に入り混み、必要な情報をビューに渡すことができます。
ビューコンポーザーはどうやってコントローラーに組み込まれるのか?については、サービスプロバイダが担っています。
サービスプロバイダについては、以前こちらの記事に少し記載しました。
リーダブルを要約すると、「Laravelのコアサービス(サービスコンテナの結合や、イベントリスナ、フィルター、それにルート)などを登録するLaravelの初期起動処理部分」だと思ってます。(リーダブルには「Laravel初期起動プロセス全体の最も重要な側面」との表現が有るくらい、大事な機能になるそうです)
また、リーダブルにはビューコンポーザーについて、「アプリケーション内の複数のルートかコントローラが同じビューを返し、常に特定のデータが必要な場合にきわめて役立ちます。」と記載されています。
・ビューコンポーザを使うことで、同じデータなのであれば、コントローラーの記述量を減らすことができる
・ビューコンポーザーを使うためには、サービスプロバイダを利用する
ことを把握した上で、使い方を見ていきます。
ビューコンポーザの使い方
サービスプロバイダを作る
コントローラーやモデルと同様、artisanコマンドで作成できます
php artisan make:provider HogeServiceProvider
以下のファイルができました。
ファイルは、app/Providers/HogeServiceProvider.php になります。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class HogeServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
config/app.phpに追加する
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
(以下続く)
//新規追加
Illuminate\Auth\HogeServiceProvider::class,
]
読み込まれるよう、登録します。
Composerのファイルを作る
artisanコマンドがないので、自分で作ります
<?php
namespace App\View\Composers;
use App\Repositories\UserRepository;
use Illuminate\View\View;
class HogeComposer
{
/**
* userリポジトリの実装
*
* @var UserRepository
*/
protected $hoge;
public function __construct()
{
// 依存関係はサービスコンテナによって自動的に解決される
$this->hoge = $hoge::all();
}
/**
* データをビューと結合
*
* @param \Illuminate\View\View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->hoge->count()); //仮に10とします
}
}
サービスプロバイダにView::composerを記述
app/Providers/HogeServiceProvider.phpのboot関数に記述する
public function boot()
{
View::composer(
'hoge', 'App\Http\View\Composers\HogeComposer'
);
}
クラスを呼び出す書き方をしていますが、以下のように無名関数のコンポーザーを呼び出す書き方もできます。
//サンプル
// クロージャベースのコンポーザを使用
View::composer('dashboard', function ($view) {
});
これらの設定をすると、hoge.blade.php だと $count 変数を取り出しでき、ビューコンポーザが利用できます。
app\resources\views\hoge.blade.php
<p>{$count}</p> //10と表示される
実際には
動きの説明を読んでいただくと、controllerを全く経由していないことがわかります。
そのため、個別の処理はビューコンポーザで書くべきではないと思います。
逆に、「この部分はお決まり」な箇所は1箇所の記述で使い回しができ、controllerの記述量を減らせるメリットを受けられる&変更対応に強くなるので、ヘッダーやメニューに使える機能であるかなと思います。
コメント