はじめに
半年前くらいにビューコンポーザについて調べたつもりでしたが、見事に忘れました…。
私と共にビューコンポーザについて学んでいきましょう。
準備
ビューコンポーザを使用するには、アプリケーションのサービスプロバイダに登録する必要があります。
'providers' => [
// 他のサービスプロバイダ
App\Providers\FoodServiceProvider::class,
],
ビューコンポーザとは
ビューをレンダするときに呼び出すコールバックまたはクラスメソッド
(今回はクラスメソッドを呼び出すパターンのみ確認していきます。)
ビューコンポーザを使うと何が嬉しいの?
ビューを表示させる責務と、ビューに表示させるデータを扱う責務を完全に分けることができます。
実際に書いてみる
ビューコンポーザがない時
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class FoodController extends Controller
{
/**
* ビュー表示
* 表示させるビューにデータを渡す
*
* @return void
*/
public function index() {
return view('food.index')->with('food', 'oniku');
}
}
Controllerのindexメソッド内でビュー表示・データ定義が同時に行われています。
ビューコンポーザがある時
<?php
namespace App\Providers;
use App\View\Composers\FoodComposer;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class FoodServiceProvider extends ServiceProvider
{
/**
* 全アプリケーションサービスの登録
*
* @return void
*/
public function register()
{
//
}
/**
* 全アプリケーションサービスの初期起動
*
* @return void
*/
public function boot()
{
// クラスベースのコンポーザを使用する
View::composer('food.index', FoodComposer::class);
}
}
定義
↓
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class FoodController extends Controller
{
/**
* ビュー表示"のみ"
*
* @param View $view
* @return void
*/
public function index() {
return view('food.index');
}
}
ビューを呼び出し
↓
<?php
namespace App\View\Composers;
use Illuminate\View\View;
class FoodComposer
{
/**
* データをビューと結合
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('food', 'oniku');
}
}
ビューをレンダーする前に、データをビューと結合
ビューコンポーザがない時と比べると必要なコード量が増えていますが、責務がそれぞれ分かれています。
さいごに
今回扱ったコード量であれば、ビューコンポーザを使用すると、ファイル数も多くなってしまいますし、少し冗長かもしれません。
ですが、システムが大きくなればなるほど、Controllerに全てを詰め込んだりしてしまいがちです。
そういった状況を避ける為にも、それぞれのClassはもちろん、メソッドの責務を分ける必要があります。
そこで大活躍するのが、今回紹介したビューコンポーザです。
最初Controllerに全て詰め込んでたコードを、それぞれの責務に従って分けることができました🎉
参考URL🙏