Laravel:コンポーサーの活用1(パーシャルビュー)

タグ: Laravel3  

Laravelにはビューに対する表示準備を行うビュー・コンポーサーが用意されています。

これを使用することで、ビューを本体のビューより、独立した要素として扱うことができるようになります。

この記事では一番コンポーサーが活躍する、パーシャルビューと連携する方法を学びましょう。表示項目をコントローラーで準備しないくても済む、ビューを作成してみましょう。

例として最新ポストを考えてみましょう。20件表示するビューを考えます。今回はapplication/post/latest.blade.phpに作成しましょう。

<ul>
    @foreach($posts as $post)
        <li>{{ HTML::link_to_route('show-post', $post->title, array($post->id)) }}</li>
    @endforeach
</ul>

ポストの配列を渡し、それをリストで表示するビューです。これに、コンポーネントを登録してみましょう。通常、routes.phpで登録しますが、数が多くなったら、別のPHPファイルに作成し、includeすることも考えましょう。

View::composer('post.latest', function($view) {
  $view->posts = Post::order_by('updated_at', 'desc')->take(20)->get();
});

今回のシナリオでは、Eloquent ORMモデルであるPostクラスから取得しています。更新日時で並べ替え、20件取得します。それをビューにプロパティのpostsで渡すと、ビューの中で同名の変数として値を取得できます。

これだけで、ビューとして動作します。return view('post.latest');を実行するとページとして表示されます。

ですが、これは例えばブログパーツのような使われ方をすることでしょう。ビューのある部分にはめ込んで使いたいですよね。以下の方法でビューの中から、パーシャルビューとしても呼び出せます。

Blade構文による呼び出し:

@render('post.latest')

Bladeのecho構文による呼び出し:

{{ render('post.latest') }}

PHPによる呼び出し:

<?php echo render('post.latest'); ?>

あるいはコントローラーで操作したい場合などは変数に出力内容を受け取ることもできます。

$latestpost = render('post.latest');

もしくは、メインのビューのセクションに指定して、表示させることもできます。セクションlatestがメインのビューで定義されているならば:

return view('main.view')->nest('latest', 'post.latest');

このような使われ方をする小さなビューのために、いちいちコントローラーで準備をしていては煩雑です。このような場合は、ビューに対して表示内容の準備をさせるコンポーサーを活用しましょう。