やりたいこと
HeaderやSidenaviのような共通レイアウトに、
データを渡したい時ってありますよね。
そんな時に使えるのが「View Composer」です。
今回は、View Composerを使って、Headerに現在の会員登録数を表示してみましょう。
View Composerとは
ビューコンポーザは、ビューをレンダーするときに呼び出すコールバックまたはクラスメソッドです。ビューをレンダーするたびにビューへ結合するデータがある場合、ビューコンポーザを使用すると、そのロジックを1つの場所に集約できます。ビューコンポーザは、アプリケーション内の複数のルートかコントローラが同じビューを返し、常に特定のデータが必要な場合にきわめて役立ちます。
(参照:https://readouble.com/laravel/8.x/ja/views.html?header=%25E3%2583%2593%25E3%2583%25A5%25E3%2583%25BC%25E3%2582%25B3%25E3%2583%25B3%25E3%2583%259D%25E3%2583%25BC%25E3%2582%25B6)
View Composerの作り方
1. ServiceProviderを作る
php artisan make:provider ViewServiceProvider
artisanコマンドを叩いて、ServiceProviderを作りましょう。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewServiceProvider extends ServiceProvider
{
public function boot()
{
//
}
public function register()
{
//
}
}
2. config/app.php に追加する
'providers' => [
...
App\Providers\ViewServiceProvider::class,
],
3. Composer を作る
手動でファイルを作ります。
App\Http\View\Composers\ViewComposer.php
<?php
namespace App\Http\View\Composers;
use App\Models\User;
use Illuminate\View\View;
class ViewComposer
{
protected $users;
public function __construct()
{
$this->users = User::all();
}
public function compose(View $view)
{
$view->with('total_users', $this->users->count());
}
}
4. ViewComposerに追記する
public function boot()
{
public function boot()
{
View::composers([
ViewComposer::class => 'layouts.*',
]);
View::composer(
['layouts.header'],
'App\Http\View\Composers\ViewComposer'
);
}
}
View::composers
で、layoutsに表示させられるように宣言します。
View::composer
には、表示させたいファイル名を指定します。
5. headerに記載する
app\resources\views\layouts\header.blade.php
<p>{{ $total_users }}</p>
Header内に、3で指定したtotal_users
を記載すると、データが反映されます。
備考:ログイン済みユーザーのみ表示させたい時
Auth::user()
を使って、ログイン有無を確認してデータを渡しましょう。
use Illuminate\Support\Facades\Auth;
の指定を忘れずに。
<?php
namespace App\Http\View\Composers;
use App\Models\User;
use Illuminate\View\View;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
class ViewComposer
{
protected $users;
public function __construct()
{
if (Auth::user()) {
$this->users = User::all();
}
}
public function compose(View $view)
{
if (Auth::user()) {
$view->with('total_users', $this->users->count());
}
}
}
以上、ViewComposerを使った、共通レイアウトにデータを渡す方法でした。