端くれプログラマの備忘録 Laravel [Laravel] インクルードされるビューにデータを渡す

[Laravel] インクルードされるビューにデータを渡す

ブログのようなサイドバーがあるレイアウト。サイドバーには記事のカテゴリ一覧を表示する。サイドバーを単独でビューとして定義すれば、各ビューでそれをインクルードできるようになる。問題はコントローラの実装。サイドバーにカテゴリ一覧データを渡すために、コントローラの各アクションでカテゴリのコレクションを取得してビューに渡す必要がある。煩雑だ。コントローラを煩わせずにビューに決まったデータを渡す方法はないものか?

公式ドキュメントを眺めていたら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/