laravel6.2¦サイドバーやメニューにプロフィール画像を常に表示する!
やりたいこと
view画面でサイドバーやメニューにプロフィール画像やユーザー名などを表示する場合、viewごとにコントローラーにプロフィール画像を取得するメソットを書くのはページが多くなってくると大変…
ということで、共通で処理できすようにしたメモです。
💡 目指すこと
・viewに対してコントローラーとは別に、view用の共通の変数を作成
・view用の共通の変数を使用し、プロフィール画像とユーザー名を表示する
環境
・laravel 6.2
・php 7.2
LaravelのViewComposerでViewで使用する共通のデータを設定するを参考にさせていただきました!
ViewComposerをクラス化して外部ファイルにする を実装していきます。
ComposerServiceProvider用のProfileImageServiceを作る
最初はComposerServiceProvider内でなんとかならないかと思って試行錯誤してみたのですが、読みづらい上にうまくいかなかったので外部ファイルにしました。
⚠️ user_profilesテーブルにはid,user_name,image_file などのカラムがあり、プロフィール画像を登録している場合はimage_fileカラムにパスが入っている状態です。
use Illuminate\View\View;
use Illuminate\Support\Facades\Auth;
use App\ApplicationServices\UserImageService;
use App\Model\UserProfile;
class ProfileImageService
{
protected $userName;
protected $mimeType = ‘gif’;
protected $file = ‘’;
public function __construct(
UserImageService $userImageService
) {
$userProfile = UserProfile::where(‘auth_id’, Auth::id())->first();
// user_nameがない場合は‘’にする
$this->userName = $userProfile->user_name ?? ‘’;
if (isset($userProfile->image_file)) {
// image_fileカラムにパスが登録されている場合 $this->fileにbase64の画像の文字列、$this->mimeTypeに画像のmimeタイプを代入する
list($this->file, $this->mimeType) = $userImageService->show($gymUserProfile);
}
}
public function compose(View $view)
{
$view->with([
‘userName’ => $this->userName,
‘file’ => $this->file,
‘mimeType’ => $this->mimeType,
]);
}
}
ComposerServiceProviderに追記
View::composerの第一引数に表示するviewを指定できます。
LaravelのViewComposerでViewで使用する共通のデータを設定するにあるとおり複数のファイルにProfileImageServiceの変数を使用したい場合、View::composerに配列で指定します。
public function boot()
{
View::composer([‘layouts/top’,‘layouts/sidebar’], ‘App\Http\ViewComposers\ProfileImageService’);
}
追記したらprovider登録 → 1度php artisan config:clear
を実行
viewファイルの修正
ProfileImageService
のcomposeメソッドで定義した変数が使用できるようになっているので、ComposerServiceProviderで指定したlayouts/top
とlayouts/sidebar
を修正していきます。
$fileが空だった場合、/storage/app/public/icon
に保存したプロフィール初期画像が表示するようにしています💡
@if($file)
<img src=“data:image/{{$mimeType}};base64,{{$file}}” alt=“User Image”/>
@else
<img src=“{{ asset(‘/storage/icon/profile_image.png’) }}” alt=“User Image”/>
@endif
@if($userName)<span class=“user-name”>{{ $userName }}</span>@endif
今回はlayoutにあるメニューバーとサイドバーのファイルを修正したのですが、このファイルを各bladeファイルが@extends
ディレクティブを使用するようにすれば完了です👏
今回は@if($file)
にしていますが、もしかしたら明示的に@if(!empty($file))
の方がわかりやすくて良いのかもです🤔(詳しくなくてごめんなさい…詳しくなったら修正するかもしれません)
🎩🎩🎩
LaravelのViewComposerでViewで使用する共通のデータを設定するの内容が大変わかりやすかったので、うまく表示でき処理もスッキリできてよかったです(‘ᴗ’ )
Discussion