この記事について
あらすじ
自社サービス開発の中で共通でuser情報を使い回している箇所があり、その部分が煩雑な書き方になっていたので、処理をどこか一つにまとめたいと思っていました。
やりたい事
- 共通でuser情報を使い回しているを共通化する。
- ヘッダーのbladeファイル以外でサイドバーなどの箇所でもuser情報を使いたい。
やってみた事
- Laravel view composerを使って、処理を共通化する。
view composerとは?
ビューコンポーザはビューがレンダーされる時に呼び出される、コールバックかクラスメソッドのことです。 ビューがレンダーされるたびに結合したい情報があるなら、ビューコンポーザがロジックを一箇所にまとめるのに役立ちます。
処理イメージ図
どんな時に使うのか?
-
サイドバーなどすべてのページで共通するデータを表示したい時。
-
ビューロジックはできればコントローラーに書きたくないし、テンプレートもできるだけロジックを入れず、綺麗なhtmlのままでありたい。
-
コントローラーの肥大化を防ぎたい。
実装方法
実装手順
- ①サービスプロバイダーの用意
- ②app/config.phpに登録
- ③Composerクラスの作成
- ④SeriviceProviderへの設定
- ⑤bladeファイルの修正
①サービスプロバイダーの用意
$ php artisan make:provider ViewComposerServiceProvider
を実行して、サービスプロバイダーを生成する。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use View;
/**
* Class ViewComposerServiceProvider
* @package App\Providers
*/
class ViewComposerServiceProvider extends ServiceProvider
{
/**
*
*/
public function boot()
{
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
②app/config.phpに登録
「config/app.php」へ下記のようにSeriviceProviderを登録する
<?php
'providers' => [
App\Providers\ViewComposerServiceProvider::class,
],
③Composerクラスの作成
「app/Http/ViewComposers」という形でディレクトリを作成し、ViewComposersディレクトリの中に「LayoutComposer.php」を作成します。
<?php
namespace App\Http\ViewComposers\User\Worker;
use Auth;
use Illuminate\View\View;
/**
* Class LayoutComposer
* @package App\Http\ViewComposers\User\Worker
*/
class LayoutComposer
{
/**
* @param View $view
*/
public function compose(View $view)
{
$view->with([
'loginUser' => Auth::user(),
]);
}
}
④SeriviceProviderへの設定
bootメソッドにViewComposerが値を渡すviewを、View::composersメソッドを使って指定します。
<?php
namespace App\Providers;
use App\Http\ViewComposers\User\Agent as Agent;
use App\Http\ViewComposers\User\FriendRecommendComposer;
use App\Http\ViewComposers\User\Worker as Worker;
use Illuminate\Support\ServiceProvider;
use View;
/**
* Class ViewComposerServiceProvider
* @package App\Providers
*/
class ViewComposerServiceProvider extends ServiceProvider
{
/**
*
*/
public function boot()
{
View::composers([
Agent\LayoutComposer::class => 'agent.*',
Worker\LayoutComposer::class => 'worker.*',
FriendRecommendComposer::class => 'user.friend_recommend.block',
]);
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
⑤bladeファイルの修正
$loginUserの変数を該当箇所に書く
<?php
<div class="user-block">
<div class="img-wrap">
<img src="{{ $loginUser->userProfile->image->url }}" alt="">
</div>
<div class="user-name">{{ $loginUser->userProfile->display_name }}</div>
<div class="user-type">{{ \App\Enums\UserRole::toJapanese($loginUser->userProfile->role) }}</div>
</div>
まとめ
- 共通で使うような変数やロジックがあればview composerにまとめよう!