[Laravel] サービスプロバイダ&ビューコンポーザを使って、コントローラ内の共通処理をまとめる

ITLaravel

ブログアプリなどを作っていて、ブログ一覧画面、ブログ詳細画面でサイドバーにカテゴリーを表示している場合ですが、

今までは同じ処理を毎回メソッド内に書いていました。

$categories = Category::all();

こんな感じです。

class BlogController extends Controller
{
    public function index()
    {
        // ①
        $categories = Category::all();

        $posts = Post::all();
        
        return view("blog.index", compact('posts', 'categories'));
    }

    public function show(Post $post)
    {
        // ②
        $categories = Category::all();

        return view("blog.show", compact('post', 'categories'));
    }

}

冗長ですし、サイドバーに表示する項目が増えてくると、メソッドが大きくなりそうです。

そこでサービプロバイダとビューコンポーザを使って、共通化してみました。

まずサービスプロバイダを作成

php artisan make:provider ComposerServiceProvider

カテゴリ表示箇所を sidebar.blade.php などとして、切り出します(layouts フォルダ直下に配置しました。)

サービスプロバイダ内で ビューコンポーザを使い、sidebar.blade.php がレンダーされる度に categories を結合します。
(今回はサービスコンテナには登録してません。)

ComposerServiceProvider.php

composer('layouts.sidebar', function($view){
            $categories = Category::all();

            return $view->with('categories', $categories);
        });
    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

作成したサービスプロバイダをapp.phpに登録します。

config/app.php

 'providers' => [

        /* 省略 */

        App\Providers\ComposerServiceProvider::class,

    ],

これで、コントローラはこう書けます。

class BlogController extends Controller
{
    public function index()
    {
        // ①

        $posts = Post::all();
        
        return view("blog.index", compact('posts'));
    }

    public function show(Post $post)
    {
        // ②

        return view("blog.show", compact('post'));
    }

}

すっきりしましたね!コンポーネントが増えてきた時になどに使えそうです。

参考:

https://readouble.com/laravel/5.5/ja/views.html

ビューコンポーザ
ビューコンポーザはビューがレンダーされる時に呼び出される、コールバックかクラスメソッドのことです。ビューがレンダーされるたびに結合したい情報があるなら、ビューコンポーザがロジックを一箇所にまとめるのに役立ちます。

サービスプロバイダーとは

Laravelはサービス毎に初期処理を定義し、実行する仕組みを持っています。
その仕組や、実際に初期処理の実装を行うクラスのことをサービスプロバイダーと言います

以上になります。

スポンサーリンク

Posted by nobuhiro harada