こんにちは。コバヤシです。
今回はLaravelでview composerを使って、ビューのロジックを分離する方法を書いていきます。
view composerとは
view composerとは、ビューを表示するビジネスロジックをコントローラから分離して記述するための仕組みです。 各ページで共通するデータを表示したい時等に使用します。
ビューを表示する前に呼び出され、値をセットします。FuelPHPで言うところのPresenterのような役割です。
コンポーザを作成する
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を積極的に使っていきたいと思います。