0
1

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.

【Laravel8】view composerを活用して、HeaderやSidenaviにデータを渡そう

Posted at

やりたいこと

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を使った、共通レイアウトにデータを渡す方法でした。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?