ブログのようなサイドバーがあるレイアウト。サイドバーには記事のカテゴリ一覧を表示する。サイドバーを単独でビューとして定義すれば、各ビューでそれをインクルードできるようになる。問題はコントローラの実装。サイドバーにカテゴリ一覧データを渡すために、コントローラの各アクションでカテゴリのコレクションを取得してビューに渡す必要がある。煩雑だ。コントローラを煩わせずにビューに決まったデータを渡す方法はないものか?
公式ドキュメントを眺めていたらView Composerを使えばできそう。試す。
サイドバーのビュー
sidebar.blade.php
1 2 3 4 5 6 7 |
<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
1 2 3 4 5 6 7 8 9 |
@extends('main') @section('content') <section id="content"> (メインコンテンツ) </section> @include('sidebar') @endsection |
サービスプロバイダを作成
1 |
$ php artisan make:provider ComposerServiceProvider |
サービスプロバイダを実装
app/Providers/ComposerServiceProvider.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?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
1 2 3 |
'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/