ビューのロジックを分離!Laravelでview composerを使う方法

こんにちは。コバヤシです。

今回はLaravelでview composerを使って、ビューのロジックを分離する方法を書いていきます。

view composerとは

view composerとは、ビューを表示するビジネスロジックをコントローラから分離して記述するための仕組みです。 各ページで共通するデータを表示したい時等に使用します。
ビューを表示する前に呼び出され、値をセットします。FuelPHPで言うところのPresenterのような役割です。

readouble.com

コンポーザを作成する

view composerを使うために、まずはcomposerを作成します。

app/Http/ViewComposers/NewsComposer.php

<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;
use App\Repositories\News\NewsRepositoryInterface;

class NewsComposer
{
    public $news;

    public function __construct(NewsRepositoryInterface $news)
    {
        $this->news = $news;
    }

    /**
     * Bind data to the view.
     * @param View $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('news', $news->all());
    }
}

compose内でview->withで値をセットします。

サービスを作成する

次にコンポーザを使用するためのサービスを作成します。

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()
    {
        View::composer('hoge.index', \App\Http\ViewComposers\HogeComposer::class);
        View::composer('news.*', \App\Http\ViewComposers\NewsComposer::class);

        View::composers([
                            \App\Http\ViewComposers\NewsComposer::class => 'news.*',
                            \App\Http\ViewComposers\FooComposer::class => 'foo.index',
                        ]);

    }
}

View::composerやView::composersを使ってviewとコンポーザの紐付けを行います。
例えば上記ではビューの「hoge.index」とコンポーザの「HogeComposer」が紐づき「hoge.index」の表示の前にHogeComposerの処理が入り値がセットされます。
ビューの指定にはワイルドカードの「*」も使用可能で、「news.*」とすればnews以下のすべてのビューに紐付けを行うことも出来ます。

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

最後に作成したビューコンポーザのサービスを登録します。

config/app.php

<?php
'providers' => [
    App\Providers\ComposerServiceProvider::class, // 追記する
],

以上で、Laravelでview composerが使用できるようになりました。

まとめ

非常に簡単にview composerを使用することが出来ました。
これでコントローラからビューのビジネスロジックをある程度分離することが出来ます。
コントローラもスッキリして見通しも良くなりますね。
view composerを積極的に使っていきたいと思います。