【Laravel】ビューコンポーザを使ってビューのロジックを分離する
はじめに
今回はLaravelでビューコンポーザを使ってビューのロジックをコントローラーから分離する方法についてです。
ビューコンポーザとは
ReaDoubleでは以下のように説明されています。
ビューをレンダーするときに呼び出すコールバックまたはクラスメソッドです。ビューをレンダーするたびにビューへ結合するデータがある場合、ビューコンポーザを使用すると、そのロジックを1つの場所に集約できます。
つまり、ビューを表示する際のビジネスロジックをコントローラから分離して記述することができます。
共通するデータを複数ページで表示したい時等にビューコンポーザを使うとファットコントローラ改善に役立ちます。
ヘッダーやサイドナビなどの共通レイアウトにデータを渡したい時などに役立ちます。
今回はヘッダーとプロフィールにログインユーザー情報を渡す想定で進めます。
参考
実装手順
以下のような手順で実装を進めていきます。
- ①ServiceProviderを準備
- ②config/app.phpに登録
- ③Composerクラスを作成
- ④ServiceProviderへ設定
- ⑤設定した値をbladeで使用
①ServiceProviderを準備
$ php artisan make:provider ViewComposerServiceProvider
を実行して、ServiceProviderを作成します。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
}
}
②config/app.phpに登録
作成したServiceProviderをconfig/app.phpに登録します。
'providers' => [
App\Providers\ViewComposerServiceProvider::class, // 追加
],
③Composerクラスを作成
下記コマンドを実行してapp/Http/View/Composers配下にUserComposer.phpを作成します。
$ mkdir -p app/View/Composers && cd "$_"
$ touch UserComposer.php
作成したUserComposer.phpを以下のように編集します。
<?php
namespace App\Http\View\Composers;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
class UserComposer
{
/**
* データをビューと結合
*
* @param \Illuminate\View\View $view
* @return void
*/
public function compose(View $view)
{
$view->with('user', Auth::user());
}
}
④ServiceProviderへ設定
①で作成したViewComposerServiceProvider.phpに以下のように追記します。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider
{
/**
* Register services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
// header.blade.php と profile.blade.php にUserComposerで結合した$userが常に渡される
View::composer(['header', 'profile'], 'App\Http\View\Composers\UserComposer');
}
}
⑤設定した値をbladeで使用
ヘッダーとプロフィールのbladeで$user
を利用するように変更します。
これでコントローラからビューにログインユーザー情報を渡さなくても表示できるはずです。
さいごに
簡易的ではありますが、ビューコンポーザについて書かせていただきました。
少しでもお役に立てれば幸いです。
Laravelを使う上でコントローラの肥大化防止は逃げられない課題だと思いますので、適宜利用していければと思います。
最後までお読みいただきありがとうございました。
Discussion