ブログのようなサイドバーがあるレイアウト。サイドバーには記事のカテゴリ一覧を表示する。サイドバーを単独でビューとして定義すれば、各ビューでそれをインクルードできるようになる。問題はコントローラの実装。サイドバーにカテゴリ一覧データを渡すために、コントローラの各アクションでカテゴリのコレクションを取得してビューに渡す必要がある。煩雑だ。コントローラを煩わせずにビューに決まったデータを渡す方法はないものか?
公式ドキュメントを眺めていたらView Composerを使えばできそう。試す。
サイドバーのビュー
sidebar.blade.php
<aside id="aside"> <ul> @foreach ($categories as $category) <li><a href="{{url('category')}}/{{$category->id}}">{{category->title}}</a></li> @endforeach <ul> </aside>
サイドバーをインクルードするビュー
home.blade.php
@extends('main') @section('content') <section id="content"> (メインコンテンツ) </section> @include('sidebar') @endsection
サービスプロバイダを作成
$ php artisan make:provider ComposerServiceProvider
サービスプロバイダを実装
app/Providers/ComposerServiceProvider.php
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use App\Category; class ComposerServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { view()->composer('fix.sidebar', function ($view) { $view->with('categories', Category::all()); }); } /** * Register the application services. * * @return void */ public function register() { // } }
サービスプロバイダを登録
app/config/app.php
'providers' => [ App\Providers\ComposerServiceProvider::class, //NORI ],
動いた。
参考サイト
Views – Laravel – The PHP Framework For Web Artisans
https://laravel.com/docs/5.2/views#view-composers
[PHP]Laravelのビューで@includeしているパーツに値を渡す(View Composers) | PHP Archive
http://php-archive.net/php/laravel-view-composers/