【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の「サービス」とそのサービスを使えるようにする「サービスプロバイダ」が絡んできます。
おすすめ記事:公式:サービスプロバイダ
サービスとはLaravel内で利用できる機能のことです。そしてその使えるサービスを管理しているのが「サービスコンテナ」そのサービスコンテナにある物を使えるようにするのが「サービスコンポーザ」です。
ビューコンポーザを使用するにはサービスとして登録し、紐づけることでDIとして機能させることができるようになります。
ビューコンポーザの使い方
今回はビューコンポーザから変数に値を格納し、テンプレートから参照できるように作っていきたいと思います。
ビューコンポーザを使う流れ
- サービスプロバイダを作成
- ビューコンポーザクラスの作成
- サービスプロバイダの登録
- 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'
);
}
}
- registerメソッド:サービスコンテナへの登録
- bootメソッド:ブートストラップ(自動実行処理)
ビューコンポーザを使用するにはブートストラップ(自動実行処理)を管理している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);
ビューコンポーザまとめ
ビューコンポーザの特徴
- 自動実行される処理
- Webページをレンダリングする際に実行
- bladeファイルごとに紐付け
- レスポンスとレンダリングの間に挟める処理
- ファイルはクラスで定義
- 管理場所は「app」>「Http」>「View」>「Composer」内がオススメ
- サービスとサービスプロバイダと深い関係
- 作成コマンド:php artisan make:provider TestServiceProvider
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。