1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravelのビューコンポーザ【個人的なお勉強アウトプット】

Last updated at Posted at 2022-03-23

参考図書

ビューコンポーザとは

LaravelはMVCアーキテクチャ。
ビューで処理をした内容を表示したい場合、ビューのテンプレートBladeで@phpディレクティブを使うやり方や、コントローラーで処理をして値を渡す方法はある。しかし、表示するだけの役割のビューテンプレートで処理をするのは避けたほうがよく、コントローラーで処理をするのも何か違う気がする。という問題がMVCにはあった。
その問題を解決するのがビューコンポーザ。
指定のビューに常に同じ処理をして表示するものがある場合、ビューコンポーザを利用したほうが良い。

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

ビューコンポーザはLaraveの「サービス」、「サービスプロバイダ」を使う。
サービスはLaravelの機能強化の仕組み。
サービスを登録するために用意するのが「サービスプロバイダ」。
サービスプロバイダにビューコンポーザというサービスを登録しておくと、自動的に実行されるようになる。

サービスプロバイダのつくりかた

php artisan make:provider HelloServiceProvider

app/provider/の中にファイルが作成される

サービスプロバイダの基本形

app/provider/HelloServiceProvider.php
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class プロバイダクラス extends ServiceProvider{
public function register(){
//コンポーザの設定
}
public function boot(){
//コンポーザの設定
}
}

サービスプロバイダはServiceProviderというクラスを継承して作成される。
registerメソッドはサービスプロバイダの登録処理を行う。
bootメソッドはアプリケーションサービスへのブートストラップ処理(アプリケーションが起動する際に割り込んで実行される処理)。
ここにコンポーザを設定する処理を用意することで、設定したビューをレンダリングする際に自動的にコンポーザが呼び出されるようになる。

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

HelloServiceProviderクラスをプロバイダとしてアプリケーションに登録

config/app.php
'providers' => [
...
...
App\Providers\HelloServiceProvider::Class
],

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

ビューコンポーザには二通りの使い方がある

  • boot内に無名クラスでビューコンポーザの処理を読み込む
  • ビューコンポーザのクラスを定義して、bootで設定する

本格的に使うときは「ビューコンポーザのクラスを定義して、bootで設定する」。

boot内に無名クラスでビューコンポーザの処理を読み込む

app/Providers/HelloServiceProvider.php
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class プロバイダクラス extends ServiceProvider{
public function register(){
//コンポーザの設定
}
public function boot(){
  View::composer(
    'hello.index', function($view){
      $view->with('view_message','composer message!');
    }
  );
}
}

引数の$viewはIlluminate\View名前空間にあるViewクラスのインスタンス。ここにあるメソッドなどを利用してビューを操作することができる。
withメソッドはビューに変数などを追加することができる。

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

ビューコンポーザを利用

resources/views/hello/index.blade.php
@section('content')
<p>ViewComposer value:{{$view_message}}</p>
@endsection

ビューコンポーザのクラスを定義して、bootで設定する

ビューコンポーザのクラスは特に配置する場所は用意されていない。Httpフォルダ内であればどこでも利用可能。

app/Http/Composers/HelloComposer.php
namespace App\Http\Composers;

use Illuminate\View\View;

class HelloComposer{
  public function compose(View $view){
    $view->with('view_message' $view->getname());
  }
}

コンポーザクラスで必要になるのはcomposeメソッド。インスタンスを引数として持っていて、サービスプロバイダのbootからView::composerが実行された際に呼び出される。
上記のHelloComposerをビューコンポーザとして利用するため、HelloServiceProviderに記述。

app/Providers/HelloServiceProvider.php
public funtion boot(){
  View::composer(
    'hello.index', 'App\Http\Composers\HelloComposer'
  );
}

第2引数に呼び出すクラス名を指定。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?