Laravel:コンポーサーの活用2(テンプレート)

タグ: Laravel3  

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

一番の使われどころは、独立したパーシャルビューを使いやすくすることでしょう。そのビューで表示するデーターの用意をコントローラーに書かなくて済みます。コントローラーはすっきり、使い勝手は向上と良いことばかりです。

もう一つの使い所は、各ページ共通部分をレイアウト(テンプレート)とし、そのビューに対して使用することで、全頁共通のデーター取得処理をコンポーサーに任せてしまうことです。

今、小さなビューを考えてみましょう。helloビューです。

@layout('template')
@section('content')
<p>
    ようこそ
    @if ( Auth::check() )
        {{ Auth::user()->username }} さん
    @else
        世界!
    @endif
</p>
@endsection

ハローワールドです。ログイン時はユーザー名を表示します。レイアウトにtemplateビューを使用しています。では、このビューを作成しましょう。

<html>
    <head><title>トップページ</title></head>
    <body>
        @if ( $message )
            <p class="message">{{ $message }}</p>
        @endif
        <div>
            @yield('content')
        </div>
    </body>
</html>

コンテンツを表示しています。それとメッセージが存在すれば、それも表示します。

トップページとして表示するルートを定義するなら、routes.phpに記述します。

Route::get('/', function() {
    return view('hello');
});

でもこれですと、メッセージが渡されていません。トップページですから、他のルートからリダイレクトされ表示されることもあります。その場合、メッセージがセッションのフラッシュデーターとして渡されてくることがあります。例えばログアウトルートからリダイレクトするとしましょう。

Route::get('logout', function() {
    Auth::logout();
    return Redirect::to('/')
        ->with('message', 'ログアウトしました');
});

そしてメッセージを受けるトップのルートはこうなります。

Route::get('/', function() {
    return view('hello')
        ->with('message', Session::get('message', false));
});

さて、これで終了…と思いましたが、待てよ。メッセージを受けて表示するのは何もトップページとは限りません。全ルートに対してリダイレクトされ、メッセージが渡される可能性はあります。すると、全頁に同じwite()で記述する必要が起きます。

これは、美しくありませんし、手間がかかります。

こうした場合、メッセージは各ページの責任でなく、レイアウトであるtemplateビューがレンダリングされる前に用意が整っていればよいものだと気がつけば、コンポーサーを利用できます。

View::composer('template', function($view) {
    if ( !isset($view->message) ) {
        $view->message = Session::get('message', false);
    }
});

これで、どのルートでどのビューを表示しても、メッセージの取り扱いは考えなくて済むようになりました。

    return view('hello');

もし、リダイレクトされ、メッセージがフラッシュデーターとして渡されていても、自動的に表示されます。

もちろん、このルートでメッセージを表示したければ、with()で指定できます。その場合、フラッシュデーターで渡されたメッセージより、優先度は高くなりますね。コンポーネントでそうコーディングしましたからね。

    return view('hello')
        ->with('message', 'このメッセージは必ず皆様の手元へ届けるんだ!');