LaravelでViewComposerを使ってコントローラーをすっきりさせる
2017/01/31
こんにちは、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を使って開発している方の参考になれば幸いです。
Web開発のお仕事を募集しています
フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。
「Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。
ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。
LINKお問い合わせ
スポンサーリンク