のぐそんブログ

暗いおじさんがシコシコ書くブログです。

Laravelでビューコンポーザーを利用するメモ

ビューコンポーザーとは

ビューのロジックはコントローラーや、テンプレートに書きたくない問題を解決する機能です。 ビューコンポーザーはビューをレンダリングする際に自動的に実行されます。

ビューコンポーザーの処理はコントローラーからは見えません。 コントローラーで処理する必要がある場合は、ビューコンポーザーは利用できません。

ビューで必ず行われる処理を実行する際に利用します。

サービスプロバイダについて

ビューコンポーザーを利用する場合には、サービスプロバイダという仕組みを利用します。

サービスプロバイダは以下のコマンドで作成できます。

php artisan make:provider MyServiceProvider

サービスプロバイダのファイルはapp/Providersフォルダ内に作成されます。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

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

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

ソースコードの中にある、bootメソッドはアプリケーションが起動するときに、割り込んで実行される処理です。 registerは必要なサービスの登録を行う為に利用します。

ビューコンポーザーを定義する

ビューコンポーザーを定義してみます。

View::composer(ビューファイルの指定,無名関数orクラス)
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View; //← 追加

class MyServiceProvider extends ServiceProvider
{

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        View::composer(
            'index', function ($view) {
            $view->with('message', 'こんにちは!');
            }
        );
    }
}

サービスプロバイダを登録する

次に作成したサービスプロバイダをアプリケーションに登録します。 登録は/config/app.phpprovidersの項目にします。 ここに登録することで、アプリケーション起動時に登録されて、利用できるようになります。

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        ...中略...
        APP\Providers\MyServiceProvider::class
    ],

ビューコンポーザーを利用してみる

{{$message}}

表示

こんにちは!

ビューコンポーザーをクラスで定義してみる

まずはapp/Http/Composers/MyComposer.phpを作成します。 クラスの作成場所はどこでも良いみたいです。

<?php

namespace App\Http\Composers;

use Illuminate\View\View;

class MyComposer
{

    public function compose(View $view)
    {
        $view->with('message','こんにちは');

    }
}

作成したクラスを利用する為に、サービスプロバイダに定義します。

class MyServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        View::composer('hello.index','App\Http\Composers\HelloComposer');
    }
}

表示

こんにちは!

複数のファイルで共有する

ビューコンポーザーは複数のビューで共通して利用されることが多いと思います。 複数で利用する場合はサービスプロバイダを以下のようにします。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\View;
use App\Http\Composers\MyComposer;

class MyServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        View::composers([
            MyComposer::class => [
                'index',
                'mypage'
            ]
        ]);
    }
}