Laravel

Laravel view composerの使い方を解説

タクマ

こんにちは!タクマです。

31歳未経験からエンジニア転職に成功し、

2021年3月より都内の受託開発企業にてサーバーサイドエンジニアとして働いており、

PHP/Laravel、Vue.jsを使用し開発をしています。

今回は、Laravelのview composerについて解説します。

view composerってなに?

view composerの使い方がわからない

という方はこの記事を読めばview composerの機能と使い方がわかるようになりますので、ぜひ最後まで読んでください!

view composerとは?

view composerとは、ビューを表示するビジネスロジックをコントローラから分離して1つの場所に集約して記述するための仕組みです。

そしてルートやコントローラを問わず常に特定のデータをビューに返すことができます。

view composerの実装方法

サービスプロバイダーの用意

まず、view composerを登録するサービスプロバイダーを作成します。

下記のartisanコマンドで作成することができます。

$ php artisan make:provider ViewComposerServiceProvider
<?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に登録

先ほど作成したViewComposerServiceProviderconfig/app.phpに登録します。

 'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Notifications\NotificationServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Package Service Providers...
         */

        /*
         * Application Service Providers...
         */
         App\Providers\ViewComposerServiceProvider::class,   // 追加


    ],

Composerクラスの作成

app/View/Composerというディレクトリを作成し、Composerディレクトリの中にHeaderComposer.phpを作成します。

(※このComposerクラスのファイル名は任意のもので結構です。)

<?php

namespace App\View\Composers;

use App\Repositories\Contracts\AuthContract;
use Illuminate\View\View;

class HeaderComposer
{
    protected $authRepository;

    /**
     * constructor
     *
     * @param AuthContract $authRepository
     */
    public function __construct(AuthContract $authRepository)
    {
        $this->authRepository = $authRepository;
    }

    /**
     * viewにログインユーザーのステータスを常に結合して渡す
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $authUser = $this->authRepository->getAuthUser();

        $view->with([
            'status' => $authUser->status
        ]);
    }
}

この記述により対象の(後ほど解説します。)bladeファイルにログインユーザーのステータスが常に渡させるようになりました。

サービスプロバイダーへの登録

始めに作成したサービスViewComposerServiceProviderに先ほど作成したHeaderComposer.phpを登録します。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\View\Composers\HeaderComposer;

class ViewComposerServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        View::composers([
            // header.blade.phpにHeaderComposerで結合した$statusが常に渡される
            HeaderComposer::class => 'header'
        ]);
    }
}

これによりheader.blade.phpログインユーザーのステータスが常に渡させるようになりました。

bladeファイルで渡された変数を活用する

@if ($status === 1)
    <a class="link" href="{{ route('contract.form') }}">
        契約する
    </a>
@else
    <a class="link" href="{{ route('contract.index') }}">
        契約状況を確認
    </a>
@endif

これで、header.blade.phpには常に、$statusが渡されるようになりました。

header.blade.phpはどのbladeファイルにも

@include('header)

のようにして呼び出しているので、結果、ルート・コントローラーを問わず、$statusが渡される訳です。

サービスプロバイダーへの登録方法(その他)

先ほどサービスプロバイダーでの登録処理は、header.balde.phpのみへの登録でしたが、その他のbladeファイルへの登録をする場合も解説します。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\View\Composers\HeaderComposer;

class ViewComposerServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        View::composers([
            AppComposer::class => '*',  // 全てのbladeファイルに渡される
            AppComposer::class => 'user.*',  // userディレクトリ以下全てのbladeファイルに渡される
            AppComposer::class => 'user.index'  // userディレクトリのindex.blade.phpに渡される
        ]);
    }
}

上記のようにすることで、全てのbladeファイルに渡したり、特定のディレクトリ以下にだけ渡したり、特定のbladeファイルにだけ渡したりすることができます。

さいごに

いかがでしたでしょうか?

view composerの使い方ついて理解できましたでしょうか?

ご質問やご指摘等ある方はコメントしていただければ返信させていただきます。

これからもLaravelエンジニアの方、Laravel学習中の初学者の方に役に立つ記事を更新していきますのでよろしくお願いします!

Twitterでも情報発信をしていますので、よかったらフォローをお願いします(^^)

Webエンジニア
タクマ
埼玉県出身の31歳

30歳からプログラミングを始め31歳でWebエンジニアに転職成功。

現在は都内の受託開発企業にてサーバーサイドエンジニアをしています。

\ Follow me /

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA