laravel5.1で、サイドバーにMySQLのレコード(カテゴリーなど)を常に表示するには、view composer(サービスプロバイダ)を使えば良い。
a, 従来のやり方
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// サイドバーを作る // resources/views/include/sidebar.blade.php <ul> @foreach ($categories as $category) <li><a href="{{url('category')}}/{{$category->id}}">{{$category->name}}</a></li> @endforeach <ul> //サイドバーをインクルードしたView resources/views/index.blade.php <!-- /sidebar --> @include('include.sidebar') // コントローラー class IndexController { public function index() { // 全カテゴリーを取得する $categories = Category::all(); return view('index')->with(compact('categories')); } } |
上記でも、サイドバーにカテゴリーのリストは表示されるけど、各コントローラーで必ずcategories変数を渡す必要があって、面倒くさい。
b, view composer(サービスプロバイダ)を使う
1, サービスプロバイダとは、laravelで機能を提供するための仕組みです(関数やライブラリのように処理をまとめたもの)
2, View Composerとは、特定のbladeファイルを描写(レンダリング)する時に、特定の処理を実行する仕組み(まさに今回のパターン!)
つまり、View Composerの機能をlaravelで使えるようにするは、サービスプロバイダ上で実装する必要がある。
3, まず、サービスプロバイダのファイルを作る(ViewComposerという名前のプロバイダ名。名前はなんでもいい)
1 |
php artisan make:provider ViewComposerServiceProvider |
4, app\Providers\ViewComposerServiceProvider.phpが生成されるので、boot関数にbladeファイルと処理を書く
1 2 3 4 5 6 |
public function boot() { view()->composer('fix.sidebar', function ($view) { $view->with('categories', Category::all()); // use Categoryを忘れずに! }); } |
5, config\app.phpのproviders[]の最後に追加する
1 2 3 |
'providers' => [ App\\ViewComposerServiceProvider::class, // サービスプロバイダをlaravelに登録する ], |
6, viewに変数を渡さなくても、カテゴリーを表示される事を確認する。
1 2 3 4 5 6 7 |
class IndexController { public function index() { return view('index'); } } |