vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです

LaravelでViewComposerを使ってコントローラーをすっきりさせる

      2017/01/31

LINEで送る
Pocket

laravel-viewcomposer
こんにちは、okutani(@okutani_t)です。Laravelで利用できるViewComposerを使うことで、他のViewで使い回しができるデータをまとめて設定することができます。

こうすることで、コントローラーの肥大化を防ぐことができますね。

よくある使い方として、「ユーザー情報を毎回取得して、それぞれのViewに反映させたい」なんてときに活躍するかと思います。

なお、本記事ではLaravel5.1を使って検証しています。

というわけで、さっそくViewComposerの使い方を見ていきましょう。

参考LaravelのViewComposerの活用に関して – 新人Webエンジニアの記録。
参考【laravel】view composerでviewロジックを分離する – Qiita

スポンサーリンク

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

まずはサービスプロバイダーを作成していきましょう。

次のコマンドでサービスプロバイダーを生成。

$ php artisan make:provider ComposerSeriviceProvider

「app/Providers」に「ComposerSeriviceProvider.php」ファイルが作成されました。一応、生成されたサービス・プロバイダーの中身を載せておきます。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerSeriviceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

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

このままだとLaravelアプリ起動時に読み込めないため、「config/app.php」へ下記のようにComposerSeriviceProviderを登録しておきましょう。

'providers' => [
  // 省略
  App\Providers\ComposerSeriviceProvider::class,
],

これで、アプリ起動に先ほど生成したサービスプロバイダーが読み込まれます。

ただし、まだ何も値を取得していないので、一例として次の手順でユーザー情報を取得してViewに渡すようにしてみましょう。

ViewComposerの実装

では、実際にユーザー情報を取得するViewComposerを実装していきましょう。

まずは「app/Http/ViewComposers」という形でディレクトリを作成し、ViewComposersディレクトリの中に「UserComposer.php」を作成します。

UserComposer.phpに次のコードを記述。

<?php

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use Illuminate\Contracts\Auth\Guard;

class UserComposer {
    /**
     * @var String
     */
    protected $auth;

    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

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

現在ログインしているユーザーの情報を取得するViewComposerを作成してみました。

これを扱うには「ComposerSeriviceProvider.php」を次のように書き換えます。

<?php

namespace App\Providers;

use View;
use Illuminate\Support\ServiceProvider;
use App\Http\ViewComposers\UserComposer;

class ComposerSeriviceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
      View::composers([
          UserComposer::class => [
              'admin.dashboard',
              'admin.blog'
          ]
      ]);
    }

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

bootメソッドにViewComposerが値を渡すviewを、View::composersメソッドを使って指定します。

registerメソッドはアプリ初期処理時に呼び出されます。今回は利用しません。

これで「admin/dashboard.blade.php & admin/blog.blade.php」で「$user」が利用できます。bladeファイルで次のようにすれば、idやnameが表示できます。

{{ $user->name }}
{{ $user->id }}

今回は一例として、上記のふたつのViewに$userを渡しましたが、分割したheaderファイルなんかに渡すようにすれば、システム全体で利用することができますね。ただし、その場合はheaderファイル内でしか$userを参照できないので注意しましょう。

サービスプロバイダー内では、クロージャーを使って直接記述することもできます。その場合はViewComposerファイルは不要です。

public function boot()
{
  // クロージャーを使ってviewに渡す
  View::composer('admin.dashboard', function($view) {
    $view->with('user_name', 'okutani');
  });
}

上記のクロージャーの例では実装めちゃくちゃ端折ってますが、上記で$user_nameからokutaniが取得できます。複雑な処理とかはViewComposerで書いた方がいいですね。

あとはSidebarComposerとか、CustomerComposerとか、自由に作ってサービスプロバイダーで呼び出していけばコントローラーがどんどんすっきりしていきますね。

Laravelを使って開発している方の参考になれば幸いです。

LINEで送る
Pocket

okutani (okutani_t) のヒトコト
ViewComposerを使うと共通した処理なんかをまとめることができるので、積極的に使ったほうがいいですね。もっと便利な使い方があったら追記します。

Web開発のお仕事を募集しています

フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。

Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。

ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。

LINKお問い合わせ

LINKokutani's Portfolio


 - Laravel

スポンサーリンク

PC用AdSense

PC用AdSense

  こちらもどうぞ

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。