【Laravel】ビューコンポーザとは?使い方や意味、メリットを読み解く

この記事からわかること

  • Laravelビューコンポーザとは?
  • 使い方意味メリット
  • サービス/サービスプロバイダとは?
  • withメソッドを使った変数の渡し方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

初心者の私がLaravelを学習中「ビューコンポーザ」についてすこし気になったので深堀り、自分の理解できる範囲でまとめてみました。

ビューコンポーザとは?

ビューコンポーザとはLaravel内で作成できる「Webページをレンダリングする際に自動で実行される処理を設定できる機能 」のことです。ここでいうレンダリングとはHTMLなどを計算し、ユーザが閲覧できる状態のページへと変換することを指しています。

そしてビューコンポーザのように自動的に組み込まれる仕組みのことはプログラミング用語でDI(Dependency Injection:依存性注入)と呼ばれています。

ビューコンポーザとは?

ページにアクセスされる時に自動実行される処理のこと

Laravelではルーティングにマッチしたアクセスに対してレンダリングされたViewオブジェクトをコントローラ内から返すことでWebページを表示させることができます。実際にはview関数が引数に指定されているファイルを元にレンダリングを行ってくれています。

web.php

Route::get('/', 'App\Http\Controllers\welcomeController@index')

welcomeController.php

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class welcomeController extends Controller
{

    public function index()
    {
        // Viewオブジェクトを返す
        return view('welcome.index');
    }
}

ビューコンポーザのメリット

ビューコンポーザのメリットはMVCモデル(※)に準ずるビジネスロジックの切り離しです。早い話が「データとロジックを別々で管理しようね」ってことです。

ここでいうデータはView側であるbladeテンプレートのこと、ロジックはテンプレートで扱うデータを、操作する処理のことです。

コントローラ側に処理を記述することも可能ですがMVCモデルに乗っ取るとあくまでコントローラーは命令を投げるだけであり、データを取得、操作、整形などする処理は別部分に持たせるのがスッキリしたコードになります。

ビューコンポーザのメリット

MVCモデル(※)に準ずるビジネスロジックの切り離し

※:MVCモデル(アーキテクチャ)とはアプリケーションのプログラムを3つの要素Model(データ)、View(表示される画面)、Controlle(MとVを操作する) で構成させる考え方のことを指します。

おすすめ記事:【Laravel】MVCモデルとは?メリットや仕組み、構造を理解しよう!

サービスとサービスプロバイダ

ビューコンポーザを使うためにはLaravelの「サービス」とそのサービスを使えるようにする「サービスプロバイダ」が絡んできます。

サービスとはLaravel内で利用できる機能のことです。そしてその使えるサービスを管理しているのが「サービスコンテナ」そのサービスコンテナにある物を使えるようにするのが「サービスコンポーザ」です。

ビューコンポーザを使用するにはサービスとして登録し、紐づけることでDIとして機能させることができるようになります。

ビューコンポーザの使い方

今回はビューコンポーザから変数に値を格納し、テンプレートから参照できるように作っていきたいと思います。

ビューコンポーザを使う流れ

  1. サービスプロバイダを作成
  2. ビューコンポーザクラスの作成
  3. サービスプロバイダの登録
  4. bladeファイルから変数を参照する

実際に自動実行して欲しい(データを変数に格納する)処理を記述するのは「2.ビューコンポーザクラスの作成」部分です。より簡単に処理を記述する方法としてクラスを作成せずに無名クロージャとして登録する方法もあります。詳しい方法は後述します。

1.サービスプロバイダを作成

サービスプロバイダを作るにはartisanコマンドを実行します。

$ php artisan make:provider TestServiceProvider

「app」>「Providers」内に指定した「TestServiceProvider.php」が作成されています。中を開くと2つのメソッドが最初から作られています。

TestServiceProvider.php

<?php

namespace App\Providers;

// 追加
use Illuminate\Support\Facades\View;

use Illuminate\Support\ServiceProvider;

class TestServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return  void
     */
    public function register()
    {
        // 今回は無視
    }

    /**
     * Bootstrap services.
     *
     * @return  void
     */
    public function boot()
    {
      // 以下を追加
      View::composer(
        'index','App\Http\View\Composers\TestComposer'
      );
    }
}

ビューコンポーザを使用するにはブートストラップ(自動実行処理)を管理しているbootメソッドに記述していきます。ここで記述するのは実際に実行させたい処理を定義しているビューコンポーザクラス(または実際の処理)を指定しておきます。

View::composerがビューコンポーザを設定するためのメソッドです。

View::composer('指定するbladeファイル','ビューコンポーザクラスor実際の処理');

上部にはViewファザードが使えるように読み込むための以下の一文も忘れないようにしてください。

use Illuminate\Support\Facades\View;

クラス作成を行わずにここに無名クロージャとして実際の処理を直接記述することも可能です。その場合は「2.ビューコンポーザクラスの作成」 を読み飛ばして「2.1クラスを作成しない場合(無名クロージャ) 」へ移動してください。

2.ビューコンポーザクラスの作成

おすすめ記事:公式:ビューコンポーザ

実際の処理部分はクラスとして定義します。こちらはartisanコマンドではなく手動で作成(コピペでOK)していきます。bootメソッドに指定した通り「Http」内に「View」>「Composer」フォルダを作りその中で管理していくのが公式にからオススメされています。本来は「Http」内であれば問題ないようです。今回は「TestComposer.php」を作成します。

TestComposer.php

<?php

namespace App\Http\View\Composers;

use Illuminate\View\View;

class TestComposer
{
    public function compose(View $view)
    {
        $view->with('message', 'Laravelを学ぼう!');
    }
}

中に定義するのは継承もしていないフラットな状態のPHP通常のクラスです。ここにcomposeメソッドを定義し、引数にはビューを管理しているViewクラスのインスタンスを指定します。あとは好きなようにViewインスタンスから操作すればOKです。

Viewインスタンスが使えるようにuse Illuminate\View\View;を書くのを忘れないように注意してください。例えばviewに変数を渡す場合withメソッドを使うことでビュー内に変数の値を渡すことができます。

$view->with('変数名', '値');

2.1クラスを作成しない場合(無名クロージャ)

クラスを作成した場合はこの章を読み飛ばしてください。

クラスを作成しない場合はartisanコマンドで作成したサービスプロバイダのbootメソッドに直接処理を記述していきます。先程のbootメソッドを以下のように書き換えてください。

TestServiceProvider.php

// Viewが使えるように追加
use Illuminate\Support\Facades\View;

public function boot()
{
    View::composer(
      'index', function($view){
          $view->with('message','Laravelを学ぼう!' );
      }
    );
}

ビュー指定はそのままにクラスを指定していた部分を無名クロージャ(関数)に置き換えました。

3.サービスプロバイダの登録

サービスプロバイダを作成したら実行されるように登録していきます。まずはLaravelに作成したサービスプロバイダの存在を登録します。

「config」>「app.php」providers配列の中に先程作成したサービスプロバイダを追加します。

config>app.php

'providers' => [
    // 追加
    App\Providers\TestServiceProvider::class,
],

これで実際にビューコンポーザが実行されるようになりました。

4.bladeファイルから変数を参照する

bladeファイルからビューコンポーザで定義した変数にアクセスするのは以下のように普通に変数を使うように埋め込めばOKです。

index.blade.php

@section('main')
  <p>{{ $message }}</p> // →Laravelを学ぼう!
@endsection

また複数の値をbladeファイルに渡したい場合はクラス内(もしくは無名クロージャ内)を以下のようにすれば$name$website$registerでアクセスできるようになります。

TestComposer.php

$data = array(
  'name'  => 'ame',
  'website'   => 'https://www.qa-mikata.com/',
  'register' => 15
);
$view->with($data);

ビューコンポーザまとめ

ビューコンポーザの特徴

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index