LoginSignup
0
1

More than 1 year has passed since last update.

【Laravel】ビューコンポーザとは

Posted at

はじめに

半年前くらいにビューコンポーザについて調べたつもりでしたが、見事に忘れました…。
私と共にビューコンポーザについて学んでいきましょう。

準備

ビューコンポーザを使用するには、アプリケーションのサービスプロバイダに登録する必要があります。

config/app.php

'providers' => [
    // 他のサービスプロバイダ
    App\Providers\FoodServiceProvider::class,
],

ビューコンポーザとは

ビューをレンダするときに呼び出すコールバックまたはクラスメソッド
(今回はクラスメソッドを呼び出すパターンのみ確認していきます。)

ビューコンポーザを使うと何が嬉しいの?

ビューを表示させる責務と、ビューに表示させるデータを扱う責務を完全に分けることができます。

実際に書いてみる

ビューコンポーザがない時

FoodController.php
<?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メソッド内でビュー表示・データ定義が同時に行われています。

ビューコンポーザがある時

FoodServiceProvider.php
<?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);
    }
}

定義

FoodController.php
<?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');
	}
}

ビューを呼び出し

FoodComposer.php
<?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🙏

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1