レスポンスの基本

ルートへ文字列をリターンする

Route::get('/', function()
{
    return 'Hello World';
});

カスタムレスポンスを生成する

ResponseインスタンスはSymfony\Component\HttpFoundation\Responseクラスを継承しています。これによりHTTPレスポンスを組み立てるための数多くのメソッドが提供されています。

$response = Response::make($contents, $statusCode);

$response->header('Content-Type', $value);

return $response;

Responseクラスメソッドへアクセスする必要があり、レスポンスのコンテンツにはビューを返したい場合、Response::viewメソッドが便利です。

return Response::view('hello')->header('Content-Type', $type);

レスポンスにクッキーを付ける

$cookie = Cookie::make('name', 'value');

return Response::make($content)->withCookie($cookie);

リダイレクト

リダイレクトをリターンする

return Redirect::to('user/login');

フラッシュデータと伴にリダイレクトをリターンする

return Redirect::to('user/login')->with('message', 'Login Failed');

注目:withメソッドにより、フラッシュデーターがセッションに保存されますので、通常Session::getメソッドで取得できます。

名前付きルートへリダイレクトする

return Redirect::route('login');

名前付きルートへパラメーターを渡し、リダイレクトする

return Redirect::route('profile', array(1));

名前付きルートへ名前付きパラメータでリダイレクトする

return Redirect::route('profile', array('user' => 1));

コントローラーアクションへリダイレクトする

return Redirect::action('HomeController@index');

コントローラーアクションへパラメーターを渡し、リダイレクトする

return Redirect::action('UserController@profile', array(1));

コントローラーアクションへ名前付きパラメーターを渡し、リダイレクトする

return Redirect::action('UserController@profile', array('user' => 1));

ビュー

典型的なビューはアプリケーションのHTMLで構成されており、コントローラーとドメインロジックをプレゼンテーションロジックから切り離す便利な方法です。ビューはapp/viewsディレクトリーに保存されます。

シンブルなビューは以下のような形式でしょう。

<!-- app/views/greeting.phpに保存されているビュー -->

<html>
    <body>
        <h1>こんにちは、<? echo $name; ?>さん</h1>
    </body>
</html>

このビューをブラウザに送り返すには次のようにします。

Route::get('/', function()
{
    return View::make('greeting', array('name' => 'Taylor'));
});

View::makeの第二引数にはビューで使用するデーターの配列を渡します。

ビューにデーターを渡す

// Using conventional approach
$view = View::make('greeting')->with('name', 'Steve');

// Using Magic Methods
$view = View::make('greeting')->withName('steve');

上の例では$name変数はビューでアクセスされ、Steveの値を取ります。

ご希望であれば、データーの配列をmakeメソッドの第2パラメーターとして渡すこともできます。

$view = View::make('greetings', $data);

さらに全てのビューでアクセス可能なデーターを渡すこともできます。

View::share('name', 'Steve');

ビューにサブビューを渡す

例えば、app/views/child/view.phpとして保存されているサブビューがある場合、他のビューに以下のように渡せます。

$view = View::make('greeting')->nest('child', 'child.view');

$view = View::make('greeting')->nest('child', 'child.view', $data);

サブビューは親のビューからレンダーリングすることもできます。

<html>
    <body>
        <h1>Hello!</h1>
        <?php echo $child; ?>
    </body>
</html>

ビューの存在を確認する

ビューが存在するかを確認する必要がある場合、View::existsメソッドが使用できます。

if (View::exists('emails.customer'))
{
    //
}

ビューコンポーサー

ビューコンポーサーはビューがレンダーされる時に呼び出されるコールバック、もしくはクラスメソッドです。アプリケーション全体でレンダーされる可能性があるビューで、それに結びつけるデータが存在するならば、ビューコンポーサーで一箇所にコードをまとめる事ができます。ですから、ビューコンポーサーは"ビューモデル"とか"プレゼンター"のように機能します。

ビューコンポーサーを定義する

View::composer('profile', function($view)
{
    $view->with('count', User::count());
});

profileビューがレンダーされるたびに、countデーターはビューと結合されます。

ビューコンポーサーを複数のビューに対し、一度に設定することも可能です。

View::composer(array('profile','dashboard'), function($view)
{
    $view->with('count', User::count());
});

クラスベースのビューコンポーサーを代わりに使っている場合、便利なのはお望みでしたら、アプリケーションのIoCコンテナを使いインスタンスの解決ができることです。

View::composer('profile', 'ProfileComposer');

ビューコンポーサークラスは次のような形式です。

class ProfileComposer {

    public function compose($view)
    {
        $view->with('count', User::count());
    }

}

複数のコンポーサーを定義する

composersメソッドで、コンポーサーのグループを一度に登録できます。

View::composers(array(
    'AdminComposer' => array('admin.index', 'admin.profile'),
    'UserComposer' => 'user',
    'ProductComposer@create' => 'product' 
));

注目:コンポーサークラスをどこに保存するかという規則はありません。どこにでも自由に設置し、composer.jsonファイルでディレクティブを用い、オートロードできるように設定して下さい。

ビュークリエーター

ビュークリエーターはビューコンポーサーと全く同じように動作します。違いはビューがインスタンス化されたらすぐに実行されることです。ビュークリエーターを使用するには、ただcreatorメソッドを使用するだけです。

View::creator('profile', function($view)
{
    $view->with('count', User::count());
});

特別なレスポンス

JSONレスポンスを生成する

return Response::json(array('name' => 'Steve', 'state' => 'CA'));

JSONレスポンスを生成する

return Response::json(array('name' => 'Steve', 'state' => 'CA'))->setCallback(Input::get('callback'));

ファイルダウンロードレスポンスを生成する

return Response::download($pathToFile);

return Response::download($pathToFile, $name, $headers);

注目: ファイルのダウンロードを管理するSymfonyのHttpFoundationは、ダウンロードするファイルにASCIIのファイル名をつけることを要求しています。

レスポンスマクロ

多くのルートやコントローラの中で再利用できるように、カスタムレスポンスを定義することもできます。Response::macroメソッドを使用して下さい。

Response::macro('caps', function($value)
{
    return Response::make(strtoupper($value));
});

macro機能は、最初の引数として名前を受けます。2つ目はクロージャーです。マクロのクロージャーはResponseクラスにマクロ名を付け呼び出された場合に実行されます。

return Response::caps('foo');

app/start下のファイルの一つの中で、マクロを定義することができます。もしくは、マクロ定義を独立させたファイルに記述し、startファイルの一つから読み込むこともできます。